2016-10-06 3 views
0

Что произойдет, когда я дважды вызову два класса Class.getInstance в том же методе?Что произойдет, когда я вызову Class.getInstance для уже созданного класса?

Например:

private void widgetListeners() { 
     notifyNews.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object newValue) { 
       if (notifyNews.isChecked()) { 
        FirebaseMessaging.getInstance().subscribeToTopic(getString(R.string.news_subscriber)); 
       } else { 
        FirebaseMessaging.getInstance().unsubscribeFromTopic(getString(R.string.news_subscriber)); 
       } 
       return true; 
      } 
     }); 
     notifyVersion.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object newValue) { 
       if (notifyVersion.isChecked()) { 
        FirebaseMessaging.getInstance().unsubscribeFromTopic("Version"); 
       } else { 
        FirebaseMessaging.getInstance().unsubscribeFromTopic(Version")); 
       } 
       return true; 
      } 
     }); 
    } 

Будет лучше, если я позвоню FirebaseMessaging.getInstance() один раз в верхней части тела widgetListeners() метода и сохранить его в переменной или я просто позвонить в каждом onPreferenceChange или я придерживаюсь того, что я вы уже сделали выше?

Примечание: Я называю widgetListeners() в onCreateView фрагмента, который расширяет класс PreferenceFragment.

+3

'getInstance' - это то, что вы реализуете, поэтому оно будет вести себя, как вы хотите. Может быть, вы путаете его с методом 'newInstance()'? – alfasin

+0

Возможный дубликат [Разница между вызовом new и getInstance()] (http://stackoverflow.com/questions/3170159/difference-between-calling-new-and-getinstance) – alfasin

+0

Как сказал @alfasin, это зависит от реализации 'getInstance()', например ['Calendar.getInstance()'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) всегда будет возвращать экземпляр * new *, тогда как ['LayoutStyle.getInstance()'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/LayoutStyle.html#getInstance--) всегда возвращает один и тот же общий экземпляр. – Andreas

ответ

1

getInstance() обычно является артефактом singleton pattern. С высокого уровня это означает, что вы получаете доступ только к одному экземпляру этого класса, который создается при первом доступе к нему.

То, что вы уже сделали, должно хорошо работать. Экземпляр уже сохранен для вас, поэтому нет необходимости хранить его в другой ссылке в вашем случае.

+1

Большинство методов getInstance() 'в Java Runtime Library фактически возвращают новые экземпляры, например. [ 'Calendar.getInstance()'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--). – Andreas

+0

@ Andreas о, интересно. Я этого не понимал, спасибо за комментарий. – wuoix

+0

Спасибо. Пожалуйста, мне нужно немного разъяснений. Что происходит, когда вы создаете его во второй раз? – X09

Смежные вопросы