Разница между вызовом new и getInstance () - PullRequest
14 голосов
/ 03 июля 2010

Звонит Class.getInstance() эквивалентно new Class()? Я знаю, что конструктор вызывается для последнего, но как насчет getInstance()? Спасибо.

Ответы [ 6 ]

24 голосов
/ 03 июля 2010

Нет такого метода, как Class#getInstance().Вы, вероятно, путаете это с Class#newInstance().И да, это точно так же, как new в конструкторе по умолчанию .Вот выдержка из его Javadoc :

Создает новый экземпляр класса, представленный этим объектом Class. Класс создается как бы с помощью выражения new с пустым списком аргументов. Класс инициализируется, если он еще не был инициализирован.

В коде

Object instance = Object.class.newInstance();

совпадает с

Object instance = new Object();

Вызов Class#newInstance() фактически следует за фабричным методом шаблон.


Обновление : видя другие ответы, я понимаю, что в вашем вопросе есть некоторая неопределенность.В тех местах, где использовался метод на самом деле с именем getInstance(), часто обозначается шаблон Abstract Factory .Он будет «под капотами» использовать new или Class#newInstance() для создания и возврата интересующего экземпляра.Это просто, чтобы скрыть все детали о конкретных реализациях, о которых вам, возможно, не нужно знать.

Кроме того, вы также часто видите это имя метода в некоторых (в основном доморощенных) реализациях Singleton шаблон.

См. Также:

5 голосов
/ 03 июля 2010

В контексте абстрактного класса метод getInstance() может представлять шаблон фабричного метода .Примером является абстрактный класс Calendar, который включает статические фабричные методы и конкретный подкласс.

5 голосов
/ 03 июля 2010

Абсолютно (обычно) нет.

getInstance - это статический метод, часто используемый с Singleton Pattern в Java.Ключевое слово new фактически создает новый объект.В какой-то момент должен существовать new (хотя есть несколько других методов для создания новых объектов), чтобы фактически создать объект, который getInstance возвращает.

2 голосов
/ 16 сентября 2018

Некоторые абстрактные классы имеют методы getInstance (), потому что вы не можете создать экземпляр абстрактного класса, используя ключевое слово new.

1 голос
/ 20 июля 2017

Да, это часто используется в Singleton Pattern.Он используется, когда вам нужен только один экземпляр класса.Использование getInstance () является предпочтительным, потому что реализации этого метода могут проверить, существует ли активный экземпляр класса и вернуть его вместо создания нового.Это может сэкономить память.Как в этом примере:

    public static DaoMappingManager getInstance() {
    DaoProperties daoProperties = null;
    try {
        daoProperties = (DaoProperties) DaoProperties.getInstance();
    } catch (PropertyException e) {
        e.printStackTrace();
    }
    return getInstance(daoProperties);
}

public static DaoMappingManager getInstance(DaoProperties daoProperties) {
    if (instance == null) {
        instance = new DaoMappingManager(daoProperties);
    }

    return instance;
}
0 голосов
/ 16 сентября 2018

Для начала: newInstance() является static method. Это означает, что вы можете получить к нему доступ, не создавая новый класс напрямую! И он сам создает этот класс «с необходимыми начальными значениями» (через внутренний new myClass()). Это означает, что вы можете добавить несколько newInstance методов (newInstance4usage1, newInstance4usage2, ...) для разных нужд, которые для статического метода создают класс с различной инициализацией. Иногда это помогает пользователю класса (конечному программисту) создавать класс без каких-либо забот и очень удобно.

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

Мне нравится!


Извините за медленный ответ, я печатаю с мобильного телефона!

...