Синглтон класс в Java [дубликат]

Запустите Xampp (apache) в качестве администратора. В google chrome type:

localhost/<insert folder name here>/<insert file name>

i.e. если созданная папка «LearnPhp», файл «chapter1.php», тогда введите

localhost/LearnPhp/chapter1.php

Я создал эту папку в папке xampp в папке htdocs, которая создается когда вы загружаете xampp.

13
задан Bob 21 January 2010 в 18:32
поделиться

5 ответов

Нет, это не так. Вы не объявили myClass private static final, ни getInstance() не является static. Код также не компилируется.

Вот идиома Singleton:

public class MyClass {
    private static final MyClass myClass = new MyClass();

    private MyClass() {}

    public static MyClass getInstance() {
        return myClass; 
    }
}

Он должен быть private, чтобы никто другой не мог получить прямой доступ к нему. Она должна быть статической, так чтобы была только одна из них. Он должен быть окончательным , чтобы его нельзя было переименовать. Вы также должны инстанцировать его напрямую во время объявления, чтобы вам не нужно было беспокоиться (так много) о резьбе.

Если загрузка дорогостоящая и вы, таким образом, предпочитаете ленивую загрузку одиночки, то рассмотрим идиому владельца одиночки , который делает инициализацию по требованию, а не во время загрузки класса:

public class MyClass {
    private MyClass() {}

    private static class LazyHolder {
        private static final MyClass myClass = new MyClass();
    }

    public static MyClass getInstance() {
        return LazyHolder.myClass;
    }
}

Однако следует поставить большой знак вопроса о том, нужна ли вам одиночка или нет. Часто она не нужна. Просто статическая переменная, перечисление, заводской класс и/или ввод зависимости часто являются лучшим выбором.

19
ответ дан 1 December 2019 в 06:53
поделиться

Вот еще один способ сделать это:

public enum Singleton{
  INSTANCE("xyz", 123);

  // Attributes
  private String str;
  private int i;

  // Constructor
  Singleton(String str, int i){
    this.str = str;
    this.i = i;
  }
}

Согласно эффективной Java Джош Блоха, это лучший способ реализации Singleton в Java. В отличие от реализаций, которые включают в себя частное статическое поле экземпляра, которое можно умножить создать при злоупотреблении отражения и / или сериализации, Enum гарантированно будет синглетом.

Основное ограничение с Enum Singletons заключается в том, что они всегда создаются в классе времени загрузки и не могут быть ленивлены созданными. Итак, если, например, вы хотите создать индивидуальность Singleton с помощью аргументов времени выполнения, вам придется использовать другую реализацию (предпочтительно, используя двойную проверку блокировки).

14
ответ дан 1 December 2019 в 06:53
поделиться

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

public class MyClass
{
    private static MyClass INSTANCE=null;

    private MyClass()
    {
    }

    public static MyClass getInstance()
    {
        if(INSTANCE==null)
        {
            synchronized(MyClass.class)
            {
                if(INSATCNE==null) INSTANCE=new MyClass();
            }
        }
        return INSTANCE;
    }
}
2
ответ дан 1 December 2019 в 06:53
поделиться

Используя свой пример и используя способ реализации IT:

public class MyClass{
    private static Myclass instance;

    private MyClass(){
        //Private instantiation
    }

    public static synchronized MyClass getInstance()  //If you want your method thread safe...
    { 
        if (instance == null) {
            instance = new MyClass();
        }

        return instance;
    }
}

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

1
ответ дан 1 December 2019 в 06:53
поделиться

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

public class MyClass {
    Myclass myclass;

    static { myclass = new MyClass();}

    private MyClass(){}

    public MyClass getInstance()
    {
        return myclass;
    }
}

не настоящий синглтон:

  1. поле MyClass не является частным, можно прочитать и изменено снаружи (при условии, что вы получили Мгновенное мнение для этого на
  2. поле MyClass не является статическим, не может быть доступен в статическом конструкторе (ошибка компиляции)
  3. метод getInstance () не является статическим Таким образом, вам нужен экземпляр, который нужно его назвать


фактическим кодом:

public class MyClass {
    static Myclass myclass;

    static { myclass = new MyClass();}

    private MyClass(){}

    public static MyClass getInstance()
    {
        return myclass;
    }
}

все еще имеет MyClass , не являющийся частным (ни окончательным) ... Объявление Их итогов поможет предотвратить его быть непреднамеренно изменилось изнутри класса.

private static final Myclass myclass;
1
ответ дан 1 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: