Вызов экземпляра статического метода - PullRequest
6 голосов
/ 05 марта 2011

Добрый день!

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

Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);

Но я узнал, что это статический метод:

Calendar.getlnstance();

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

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

Спасибо.

Ответы [ 5 ]

7 голосов
/ 05 марта 2011

Это статический фабричный метод. Идея заключается в том, что метод - это тот, который вызывает конструктор, и он возвращает построенный объект. Возможно, тело Calendar.getInstance() выглядит примерно так:

return new SomeCalendar(now);

где SomeCalender - конкретная реализация абстрактного класса Calendar. Вот некоторые из преимуществ: вам не нужно заботиться о базовом классе (насколько вы знаете, что это просто Календарь), и базовая реализация может измениться, не влияя на вас (например, код может быть изменен на return new AnotherCalendar() и вам не нужно ничего менять в своем коде)

Поскольку это статический метод, вы можете вызывать его для самого типа (Calendar.getInstance();), а не для экземпляра этого типа (Calendar c = ...; c.getInstance();).

3 голосов
/ 05 марта 2011

Java делает подобные вещи повсюду. Посмотрите на XML API.

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

Так Календарь может быть возвращен, даже если он абстрактный. Чрезмерно упрощенная реализация getInstance() может быть

Calendar getInstance()
{
    return new GregorianCalendar();
}

Вызывающий getInstance() не должен знать тип реализации для получения текущей даты и времени.

Я рекомендую просмотреть OpenJDK

3 голосов
/ 05 марта 2011

Метод экземпляра требует, чтобы у вас уже был экземпляр для вызова метода.

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

. Обычно вы не хотите, чтобы такой метод фабрики былметод экземпляра (нестатический), потому что это будет означать, что для создания нового вам уже понадобится экземпляр.Как бы вы создали первый?

(Нестатические фабричные методы существуют, но они чаще используются для создания объектов другого типа. Например, класс Builder или Factory обычно имеет методэто создает экземпляры некоторого другого класса.)

2 голосов
/ 05 марта 2011

Тот факт, что фабричный метод является статическим, не означает, что Календарь является статическим - он просто предоставляет механизм доступа для создания Календаря.

Проверьте этот пост о том, как использовать этот шаблон самостоятельно: http://today.java.net/pub/a/today/2005/03/09/factory.html

Это также объясняет немного больше о принципах, лежащих в основе паттерна.

Я рекомендую прочитать «Эффективную Java» - это отличная книга, несмотря на ее возраст!

1 голос
/ 05 марта 2011

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

Тебе действительно стоит выбрать «Эффективную Java» Джошуа Блоха. Это первый пункт в книге. Предпочитая статическую фабрику для конструктора. Преимущества, которые он упоминает:

1_ Поскольку статические фабрики имеют имена, которые могут быть описательными.

2_ Затем можно вернуть любой подтип, а не только тип определенного класса.

3_ С фабричным методом вы можете обрабатывать такие понятия, как кэширование и синглтоны. (вам не нужно слепо создавать новый объект).

4_ Чтобы уменьшить код инициализации. Например, вместо List newList = new ArrayList, у нас может быть такой метод, как getStringList ();

Четвертое преимущество - это то, к чему я не особенно прихожу, но я вижу, что Google Guava Framework это реализовал. Это одна из лучших книг по программированию для Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...