Конструктор вызывался только один раз при вызове статического метода дважды, который возвращает статический объект? - PullRequest
0 голосов
/ 05 ноября 2019

Я изучаю static в java, но пока я играю с кодами, мой конструктор вызывался только один раз (без ошибок), хотя я вызываю его более двух раз, используя статический метод, который возвращает статический объект. Почему это? пожалуйста, помогите мне понять это.

Выход: Constructor called

public class Other {

    private static Other instance = new Other(); // my constructor is here

    private Other() {
        System.out.println("Constructor called ");
    }

    public static Other getInstance() {
        return instance; // this will return the static object declared
    }
}

public class Main {

    public static void main(String[] args) {
        // calling static method 4 times that returns static object
        Other.getInstance();
        Other.getInstance();
        Other.getInstance();
        Other.getInstance();

    }
}

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Вы не создали другой объект на вашем главном компьютере, поэтому конструктор не был вызван вашим основным методом. Конструкторы вызываются только при создании объекта.

Вместо этого вы вызывали только статические методы, возвращающие переменную класса (static), для которой установлен объект Other, и, поскольку она является переменной класса, это произошло один раз (поэтому вы видите, что конструктор был вызван один раз).

При первом вызове Other.getInstance(); статическая переменная класса instance была инициализирована путем создания объекта Other. Это произошло потому, что эта однократная процедура инициализации выполняется только при первой загрузке класса.

Все остальные вызовы Other.getInstance();, переменная класса уже установлена ​​и возвращена та же ссылка на объект.

1 голос
/ 05 ноября 2019

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

Конструктор всегда private, поэтому он не может быть вызван извне класса, т.е. выне может сделать Other o = new Other(). Чтобы получить экземпляр класса, вы всегда должны вызывать публичный метод getInstance(). Возвращаемый экземпляр будет одинаковым каждый раз, потому что класс содержит STATIC ссылку на экземпляр. Поэтому конструктор private вызывается только один раз во время статической инициализации private static Other instance = new Other();.

2 сценария использования, когда вам потребуется только один экземпляр класса, может быть:

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

  • Конфигурация : конфигурация глобальная, поэтому гораздо эффективнее иметь только один экземпляр. Например, конфигурацию можно прочитать из файла в начале, а экземпляр конфигурации можно повторно использовать во всем приложении.

Надеюсь, это поможет!

1 голос
/ 05 ноября 2019

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

...