2013-08-16 4 views
1

Я работаю над приложением, которое использует this пример в качестве базы. Прокрутите страницу вниз до класса под названием «DetailFragment». Вы увидите этот метод:Почему этот метод статичен?

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

Почему этот метод статичен? Не может ли это быть сделано как обычный конструктор, как это:

public DetailsFragment(int index) { 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    this.setArguments(args); 
} 

И тогда, когда вам нужно объект просто пойти:

DetailsFragment f = new DetailsFragment(somevalue); 

Я не понимаю, почему этот метод является статическим.

+0

связанный: http: // stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java – zapl

ответ

4

Почему этот метод статичен? Не удалось ли это сделать как обычный конструктор, подобный этому

В основном первый подход использует static factory method. В этом случае не может быть никакой разницы. Вы можете написать один и тот же код в конструкторе. Ну, на самом деле будет особая проблема Android, как указано в комментариях @zapl. Если вы предоставите свой собственный параметризованный конструктор, компилятор не будет предоставлять конструктор по умолчанию. Как указано в комментариях, каждый Fragment должен иметь конструктор по умолчанию.

Но, в целом, существует несколько преимуществ использования статического метода фабрики. Некоторые из них являются:

  • Вы можете реализовать singleton pattern методом статического фабричного
  • статический фабричный метод может вернуть вам экземпляр любого подкласса.

Лучшим справочником по этой теме вы можете найти в Эффективное Java книги - Пункт 1, что я связан ниже.

Ссылка:

+1

Существует также конкретная причина Android: каждый 'Fragment' должен иметь открытый конструктор аргументов без аргументов, чтобы система могла (повторно) создать их. – zapl

+1

@zapl. Ой! Да, это тоже точка. Компилятор не будет создавать конструктор по умолчанию, как только мы предоставим параметризованный код явно. –

+0

Ах - спасибо и Рохиту, и заплату. Я знаю о некоторых применениях статики, но я не понимал, что это из-за того, что сказал zapl в этом конкретном случае. Я работаю над расширением DetailFragment в этом примере на три разных фрагмента, которые можно подключить к соответствующим вкладкам ActionBarSherlock. – CupOfQuestions

1

Оба подхода возможны в этом сценарии и одинаково хорошо.

+0

Извините, я отредактировал удаленный «return this», прежде чем вы нажмете submit :) (для тех, кто видит это, я получил это в обычном конструкторе выше) – CupOfQuestions

0

Я не уверен, почему мы создаем объект Bundle при создании экземпляра DetailsFragment. мы можем разделить оба в классе DetailFragment.

0

Вы можете использовать DetailsFragment (int index), и он может быть вызван только вами. В вашем случае это не проблема, потому что вы используете setArguments вместо class-vars.

Почему это шаблон для использования newInstance?

Если ваша ОС убивает ваш фрагмент, и в следующий раз, когда ваш фрагмент будет восстановлен, будет вызываться только конструктор по умолчанию. Опция DetailFragment (int index) больше не будет вызываться ОС. Однако аргументы, которые вы установили, могут храниться в памяти, хотя ваш фрагмент был убит один раз.

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