Intereting Posts
Firebase – несколько пользователей, одновременно обновляющих один и тот же объект, используя старое значение Как сохранить стек приложения обратно в пакет? Ошибка нескольких файлов dex при компиляции с помощью ant или Eclipse Модернизация пользовательского клиента для проверки подлинности WebTokens Есть ли способ автоматически получить доступ к Logcat двойным щелчком? Как показать диалог после сбоя с помощью Crashlytics? Как найти «последнюю страницу» в пейджере просмотра. Или общее число просмотров. Разработка Android Android создает ярлыки на главном экране Получить все аварийные сигналы, сохраненные в приложении Получите намерение от onCreate в Android Android считает, что я не закрываю свою базу данных! Зачем? Как установить Referer на веб-обозревателе Android в KitKat и вверх Com.google.firebase.database.DatabaseException: вызовы setPersistenceEnabled () должны быть выполнены перед любым другим использованием экземпляра FirebaseDatabase ViewPager Мерцает при касании внутри пустой области Установить таймаут Диалог в Android?

Почему Toast.makeText и не новый тост

Это может быть вопрос noob, но мне было интересно, почему мы должны использовать статический метод (makeText) для создания Toast, а не конструктора.

Почему мы должны использовать это:

makeText(Context context, CharSequence text, int duration) 

вместо этого:

 new Toast(Context context, CharSequence text, int duration) 

Это метод makeText:

  public static Toast makeText(Context context, CharSequence text, int duration) { Toast result = new Toast(context); LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); tv.setText(text); result.mNextView = v; result.mDuration = duration; return result; } 

Почему у нас нет следующего:

 public Toast (Context context, CharSequence text, int duration) { this(context); LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); tv.setText(text); this.mNextView = v; this.mDuration = duration; } 

Я искал веб-сайт и исходный код по какой-либо причине, но я не нашел.

Пожалуйста, если у вас есть идея, не стесняйтесь.

    Вопрос в основном сводится к тому, когда я должен ставить статический метод. Ответ прост – когда ваш метод имеет очень специфическую задачу и не изменяет состояние объекта.

    Что-то вроде метода полезности, скажем, add (int a, int b), который просто возвращает a + b. Если мне нужно сохранить значение a + b для последующего использования для объекта, статический метод строго не-no (вы не сможете хранить статическую переменную в статическом методе). Но если мы имеем дело с каким-то действием, которое не зависит от состояния объекта, то статический ответ.

    Почему мы отдаем предпочтение статике, если она не зависит от состояния объекта?

    1. Памятно-статический метод будет иметь только одну копию, независимо от фактического количества объекта.

    2. Доступность – метод доступен, даже если у вас нет единого объекта

    Конечно, недостатком является то, что мы сохраняем копию метода, даже если мы не используем его вообще (если он был нестационарным и не был создан объект, мы бы сохранили это пространство). Но это имеет меньший вес, чем преимущества, упомянутые выше.

    Поскольку метод, который мы обсуждаем здесь (makeText), не нуждается в поддержании состояния для последующего использования, лучшим способом является статический метод.

    –Редактировать–

    Ответ, упомянутый выше, более общий, когда мы должны использовать статический и нестатический, позвольте мне получить конкретный класс Toast.

    Класс Toast дает нам 2 способа создания объекта Toast (см. http://developer.android.com/reference/android/widget/Toast.html )

    1. MakeText (контекст контекста, текст CharSequence, int duration), который возвращает объект Toast, которому присвоены значения.

    2. Обычный способ, используйте новый Toast (контекст) для создания объекта, а затем задайте значения по мере необходимости.

    Если вы используете метод 1, вы говорите что-то вроде Toast.makeText (контекст, текст, продолжительность) .show (); И мы закончили. Я использую этот метод все время.

    Метод 2 используется только для конкретного случая: http://developer.android.com/guide/topics/ui/notifiers/toasts.html

    Не используйте публичный конструктор для Toast, если вы не собираетесь определять макет с помощью setView (View). Если у вас нет настраиваемого макета, вы должны использовать makeText (Context, int, int) для создания Toast.

    @CFlex, если у меня есть вопрос правильно, я думаю, вы просто хотите знать, почему у нас есть Toast.makeText (контекст, текст, продолжительность), возвращающий объект Toast, когда одно и то же может быть сделано конструктором.

    Всякий раз, когда я смотрю на что-то вроде ClassName.getObject, возвращающего объект класса, я думаю об одноэлементном шаблоне. Ну, в этом случае мы не совсем говорим об Singleton, я бы хотел предположить, что makeText возвращает тот же самый объект всегда (чтобы сохранить создание N объектов), в противном случае это просто причудливая вещь, разработанная командой Android.

    Одно правило: спросите себя: «Имеет ли смысл называть этот метод, даже если объект еще не построен?» Если это так, это определенно будет статичным.

    Помните, что объекты хранятся в памяти, и они созданы для определенных заданий. Статические методы доступны для всех объектов класса, и нет необходимости создавать объект для их использования.

    Поэтому нет причин создавать объект Toast для доступа к методу makeText , когда вы можете получить к нему доступ как статический метод (более элегантный и компактный)

    Насколько я знаю:

    Это связано с тем, что мы не хотим хранить экземпляр тоста, для которого требуется постоянное использование объема памяти до тех пор, пока он не будет очищен GarbageCollector.

    И что у него всегда есть доступ к отображению, поэтому в вашем приложении не требуется какой-либо набор разрешений.