1

Тема: Чому не викликається приватний конструктор?

Прів, я тут синглтон наробив, але костнуктор ніколи не викликається. Чому так?

public class ConfigUtil {
    private static ConfigUtil instance=new ConfigUtil();
    private Gson gson;
    private ServerConfig serverConfig;
    
    private ConfigUtil()
    {
        System.out.println("config util start");
.....

2 Востаннє редагувалося volodimirg (12.06.2016 15:18:58)

Re: Чому не викликається приватний конструктор?

private static ConfigUtil instance=new ConfigUtil()

Ось ваш виклик, який відбувається при завантаженні класу (а щоб так було, то для цього використано ключове слово static). На то і робиться приватним конструктор, щоб його не можна було викликати з інших класів.

3

Re: Чому не викликається приватний конструктор?

volodimirg написав:

private static ConfigUtil instance=new ConfigUtil()

Ось ваш виклик:) , який відбувається при завантаженні класу (а щоб так було, то для цього використано ключове слово static). На то і робиться приватним конструктор, щоб його не можна було викликати з інших класів.

кхм, так воно як раз і не викликається, тому що я не бачу System.out.printline() отого, котрий в конструкторі

4

Re: Чому не викликається приватний конструктор?

я трохи призабув уже особливості завантаження класів, але думаю, що на консоль може і не виводитись. Коли звертатись до інших членів класу вдається одержати доступ? Метод getInstance(), щось повертає?

5 Востаннє редагувалося volodimirg (12.06.2016 15:34:53)

Re: Чому не викликається приватний конструктор?

Запустив такий код, у мене усе виводиться на консоль:

package mytestsinglenon;

public class Singleton {
    
    
    public static final Singleton HOLDER_INSTANCE = new Singleton();
    
    private Singleton()
    {
        System.out.println("config util start");
    }
        
    public static Singleton getInstance() {
        return HOLDER_INSTANCE;
    }
    
    public void sayHello(){
        System.out.println("hello");
    }
    public static void main(String[] args) {
        Singleton s=Singleton.getInstance();
        s.sayHello();
    }
}

6

Re: Чому не викликається приватний конструктор?

повертає, і як раз при виклику geInstance() викликається і конструктор, це якась відкладена ініціалізація, котрої я не просив

7 Востаннє редагувалося volodimirg (12.06.2016 15:38:29)

Re: Чому не викликається приватний конструктор?

повертає, і як раз при виклику geInstance() викликається і конструктор, це якась відкладена ініціалізація, котрої я не просив

По ідеї так і повинно бути - клас завантажується віртуальною машиною при першому зверненні до нього. По ідеї усі наступні виклики getInstance не повинні викликати конструктор.

Подякували: koala, FakiNyan, leofun013

8

Re: Чому не викликається приватний конструктор?

оцього я не знав, ну ок.

9

Re: Чому не викликається приватний конструктор?

Якщо хочете, щоб клас швидше завантажувався, то можна самому його завантажити:

        try {
            Class.forName("mytestsinglenon.Singleton");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
Подякували: FakiNyan1

10

Re: Чому не викликається приватний конструктор?

Нічого не виводилися, бо фактично сам конструктор не викликався. JVM виконуючи той код що Ви навели, завантажує клас, але не ініціалізує його.
Ця поведінка закладена у специфікацію: http://docs.oracle.com/javase/specs/jls … l#jls-12.4

volodimirg написав:

Якщо хочете, щоб клас швидше завантажувався, то можна самому його завантажити:

        try {
            Class.forName("mytestsinglenon.Singleton");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Швидше він від того не завантажується. Просто цей метод, окрім завантаження, форсує ініціалізацію.

Особисто моя думка - не чіпайте того, чого до кінця не розумієте. Просто пишіть код :) Ця поведінка ніяк не вплине на нього.

Подякували: FakiNyan, leofun012