Синглтон - правильный путь - PullRequest
5 голосов
/ 20 апреля 2011
public enum YourSingleton {
    INSTANCE;

    public void doStuff(String stuff) {
        System.out.println("Doing " + stuff);
    }
}

YourSingleton.INSTANCE.doStuff("some stuff");

Вот исходная ссылка, http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/

Я спрашиваю, почему мы можем вызвать функцию doStuff таким способом в Java.

Ответы [ 4 ]

5 голосов
/ 20 апреля 2011

В Java enum может делать все, что class может [1] .YourSingleton.INSTANCE создает экземпляр YourSingleton, поэтому вы можете затем вызывать методы, как если бы это был обычный class экземпляр, которым он в основном является.

Более подробные сведения см. В официальных документах Java.обсуждение типов Enum: http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

[1] enum не имеет практической реализации наследования.Поскольку все типы enum implicity наследуют java.lang.Enum, а Java не поддерживает множественное наследование, вы не можете расширять что-либо еще.

2 голосов
/ 20 апреля 2011

Традиционный способ реализации синглтона хорош, но для поддержания его статуса как истинного синглтона необходимо защитить себя от изощренных атак сериализации и отражения.Общий способ сделать это - сделать класс Implement Serializable, сделать все поля экземпляра временными, а также реализовать метод readResolve.(которые возвращают один и тот же экземпляр синглтона).

Шаблон Enum Singleton предоставляет все эти функции из коробки.Но основной причиной, по которой мне нравится вариант Enum, является его удобочитаемость.По моему мнению, он передает то, что делает, гораздо более кратко, чем традиционный синглтон. (Вам не нужно объяснять новому разработчику все капризы, связанные с сериализацией, и как сериализация может нарушить гарантию синглтона и почемувам нужен метод readResolve и т. д. и т. д.)

0 голосов
/ 20 апреля 2011

Вы также можете использовать создание одиночного двойного замка.Предполагая, что класс MyObject, имеет конструктор private и имеет объявленное static поле instance как ноль.Тем не менее, это не гарантия того, что 2 синглтона не закончатся созданием, а гораздо более тщательная попытка обеспечить безопасность потока, чем одна проверка.

public static MyObject getInstance()
{
  if (instance == null)
  {
    synchronized(MyObject.class) {  
      if (instance == null)          
        instance = new MyObject(); 
    }
  }
  return instance;
}
0 голосов
/ 20 апреля 2011

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

Например:

public class NameOfClass{
    private static NameOfClass variableReferencingThisClass=new NameOfThisClass();

    private NameOfClass(){}

    public static NameOfClass getInstance(){
        return variableReferencingThisClass;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...