У меня есть вопрос для лучшего понимания синглтонного шаблона в Java. В частности, меня интересует приватная статическая переменная, которая является экземпляром класса, статическая переменная которого она есть. Моя проблема заключается в том, чтобы понять, что происходит, когда вы создаете статическую переменную с помощью частного конструктора. Этот объект является экземпляром класса, чей экземпляр переменной есть, но это означает, что внутри этого объекта является другой экземпляр этого класса, внутри которого находится другой, и т.д. Для того, чтобы проверить, что я написал следующий код:Очертание Singleton
public class SingletonTest {
private static SingletonTest s=new SingletonTest();
int x=0;
private SingletonTest(){}
public static void increase(int y){
s.x=s.x+y;
}
public static void main(String [] args){
SingletonTest.increase(5);
System.out.println(SingletonTest.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.x);
}
}
Отпечатано 5. Что означает объект внутри объекта внутри объекта и т. Д., Потому что есть значение переменной SingletonTest.ssssssssssssssssssx с его значением. Любое разъяснение, что на самом деле происходит, когда линия
private static SingletonTest s=new SingletonTest();
выполнено? Сколько объектов внутри объектов создано? Это должно быть бесконечно, но это невозможно. Так как верхний код работал, должно быть много. Синглтон должен создавать только один объект, но это не так, потому что внутри каждого экземпляра есть другое. И почему этот код выдал результат 5, когда только s.x увеличен, а не s.s.s .... s.x? Каждый объект внутри объекта должен иметь свой собственный x. Спасибо за любые разъяснения по этому вопросу.
Это один объект, и он является общедоступным. – marcellorvalle
«Что означает объект внутри объекта внутри объекта» Нет, вы просто получаете доступ к статической переменной через экземпляр, который допускается, но подвержен ошибкам. –
Обратите внимание, что если вы хотите реализовать настоящий синглтон, вам нужно сделать окончательную вашу переменную s, чтобы предотвратить дальнейшую модификацию, другими словами, она должна быть частной статической окончательной SingletonTest s = new SingletonTest(); –