2013-02-27 5 views
5

Это может быть просто вопрос личного вкуса и рабочего процесса, но в случае, если это более того, я чувствую, что я должен все равно спросить.Java: Разница между инициализацией конструктором и статическим методом?

В Java существуют различия между созданием экземпляра через конструктор и с помощью статического метода (который возвращает экземпляр)? Например, возьмем этот бит кода из проекта я работаю (написано до вручную во время проводки, поэтому некоторые ярлыки и вольности принимаются):

Plugin main; 
Map<int, int> map; 

public Handler(Plugin main) { 
    this.main = main; 
} 

public static Handler init(Plugin main) { 
    Handler handler = new Handler(main); 
    handler.createMap(); 
} 

public void createMap() { 
    this.map = Maps.newHashMap(); 
} 

В подобных случаях, что бы разница будет между использованием

Handler handler = new Handler(this); 

и

Handler handler = Handler.init(this); 

в классе плагинов, помимо того, что createMap() работает только в последнем, потому что это не вызывается в конструкторе?

Чтобы уточнить, в данном случае Plugin считается основным классом.

Я знаю достаточно синтаксиса Java, чтобы иметь возможность писать плагины промежуточного уровня, но недостаточно о самой Java, чтобы узнать разницу между этими двумя способами.

EDIT: Например, класс Maps, который я использовал для создания Map, использует статический заводский метод (я надеюсь, что правильно использую этот термин), вызываемый с использованием класса вместо объекта.

+5

пропустил код? – user1428716

+0

Извините; SO, пока я не набрал его! Должно быть, случайно попал в «таблетку» и не понял этого, пока не попытался нажать Enter, чтобы вставить новую строку. Но я рад, что люди смогли прочитать и ответить на него, прежде чем я смог закончить набирать его, хотя информация, предоставленная в то время, была почти нулевой B-) – ChaoticWeg

+1

«написанная вручную во время публикации» - вы всегда можете образцы тестового кода в [ideone] (http://ideone.com/) (Редактор «подсветки синтаксиса» для них не был бы плохим для создания тех, кто в первую очередь, если бы не настаивал на отступы с вкладками.) – millimoose

ответ

6

Разница - это статический заводский метод, более гибкий. Он может иметь всевозможные способы вернуть экземпляр. Он может делать другие вещи. Он может иметь более описательное имя. Его можно вызывать простым именем (например, foo(args)) статическим импортом или наследованием.

Звонок конструктора более определен - вызывающий абонент точно знает, что происходит - создается новый экземпляр этого точного класса.

+0

+1. Я бы добавил, что статический заводский метод имеет возможность возвращать экземпляр другого конкретного класса, который может быть очень полезным в некоторых случаях. – mikera

+0

Принято. Это тот тип ответа, который я ищу. Ответ Нишанта действительно полезен и информативен, но я ищу больше различий, чем преимущества/недостатки. В любом случае, оба они полезны. :) Благодаря! – ChaoticWeg

7

Есть и преимущества, и недостатки статических заводских методов.

Преимущества

  • описательные, значимые имена.
  • При вызове они могут решить, следует ли вернуть новый экземпляр
  • Они могут возвращать объект любого подтипа типа возвращаемого
  • Они уменьшают подробность создания экземпляров параметризованных типов

Недостатки

  • Если вы предоставляете только статические заводские методы, классы без открытых или защищенных конструкторов нельзя подклассифицировать
  • Они не легко отличить от других статических методов

Источник: Эффективное Java, Second Ed.

+6

преимущество # 4 больше не удерживается в java 7, которое ввело диагноз алмаза для решения этой самой проблемы. – irreputable

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