SingleTon Class, создающий более одного объекта при вызове извне класса

Вопрос:

Я написал программу для вызова класса singleton изнутри основного класса. Я также написал другой класс, из которого я пытаюсь создать объект для класса Singleton. Я обнаружил, что я могу создать только один объект, когда пытался с другого класса, но когда я попытался вызвать метод из того же класса, он создает несколько объектов. Я не мог понять, что отличается от метода основного класса и другого основного метода. Вот классы:

SingleTonClass.java

public class SingleTonClass {

private static SingleTonClass obj = null;

private SingleTonClass() {
System.out.println("Private Constructor is called");
}

public static SingleTonClass CreateObj() {
if (obj == null) {
obj = new SingleTonClass();
}
return obj;
}

public void display() {
System.out.println("The Ojecte creation complete");
}

public void display1() {
System.out.println("The second obj creation is comeplete");
}

public static void main(String[] args) {
SingleTonClass stc = new SingleTonClass();
SingleTonClass stc1 = new SingleTonClass();
SingleTonClass stc2 = new SingleTonClass();
// stc.display();
// stc1.display1();

}
}

SingleTonClassTest.java

public class SingleTonClassTest {

public static void main(String[] args) {
SingleTonClass stc=SingleTonClass.CreateObj();
SingleTonClass stc1=SingleTonClass.CreateObj();
SingleTonClass stc2=SingleTonClass.CreateObj();
}
}

Ответ №1

Вместо того, чтобы делать:

private static SingleTonClass obj=null;

Вы должны использовать: (извините за изменение имени вашего странного класса одновременно).

private static final Singleton INSTANCE = new Singleton();

Чтобы создать экземпляр единственного экземпляра вашего Singleton.

После этого вы не собираетесь делать какой-то мистический поиск вроде:

public static SingleTonClass CreateObj()
{
if (obj==null)
{
obj= new SingleTonClass();
}
return obj;
}

Вместо этого вы должны определить метод getInstance() для извлечения вашего Singleton.

public static Singleton getInstance() {
return INSTANCE;
}

После этих изменений ваш класс Singleton должен выглядеть следующим образом:

public class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {
// This is called only once
System.out.println("Private Constructor is called");
}

public static Singleton getInstance() {
return INSTANCE;
}

public static void main(String[] args) {

// Even if you ask 100 times, this will only return the same INSTANCE
Singleton stc  = Singleton.getInstance();
Singleton stc1 = Singleton.getInstance();
Singleton stc2 = Singleton.getInstance();

}

}

И запустив его, выведите:

Частный конструктор называется

на ваш CMD или терминал.

Как последнее замечание, как уже сказал @Swapnil: private Singleton() {... } Объявление используется, чтобы указать, что только сам класс Singleton способен создать экземпляр, что имеет смысл и вместо того, чтобы делать private static final Singleton INSTANCE = new Singleton(); вы можете дополнительно оптимизировать свой код, используя константу enum для хранения экземпляра (отмечен @JonK). Для дальнейшего чтения я рекомендую: singleton pattern в java

Приветствия.

Ответ №2

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

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

Ответ №3

Вместо того, чтобы создавать новый объект класса Singleton каждый раз, получаем экземпляр класса singleton. Существуют различные способы определения одноэлементного класса. Вот один из способов собрать потокобезопасный класс Singleton. для более ознакомления с этой ссылкой http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples#bill-pugh-singleton

public class BillPughSingleton {

private BillPughSingleton(){}

private static class SingletonHelper{
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}

public static BillPughSingleton getInstance(){
return SingletonHelper.INSTANCE;
}

}

Ответ №4

Singleton Class: Мы можем создать только один объект этого класса.

Возьмем пример: поскольку каждая вещь в Java является объектом, поэтому я даю вам пример реальной жизни. У вас есть дом, и в нем есть замок. У этого замка есть только один ключ, и если кто-либо извне хочет войти или получить доступ к любой вещи в вашем доме, тогда у него должен быть этот уникальный ключ. Это ограничение распространяется только на аутсайдеров. Если кто-то уже присутствует в доме, то он может сделать все, и для него нет никаких ограничений.

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

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

Ответ №5

Вы не можете создавать объекты класса singleton вне класса, потому что конструктор является закрытым. Конструктор создает экземпляр объекта. если сам конструктор является закрытым, тогда объект никогда не будет создан вне класса, а вы можете использовать метод getInstance. то вы можете получить доступ к своим функциям вне класса.

Оцените статью
TechArks.Ru
Добавить комментарий