Шаблон синглтона Java - PullRequest
17 голосов
/ 14 мая 2010

Редактировать: ответил - ошибка была не статичной

Я использовал Singleton Design Pattern

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }

У меня вопрос, как мне создать объект класса Singleton в другом классе?

Я пробовал:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

Какой правильный код?

Спасибо, Спенсер

Ответы [ 8 ]

26 голосов
/ 14 мая 2010
Singleton singleton = Singleton.getInstance();

- правильный путь. Убедитесь, что ваш getInstance() метод действительно static.

Поскольку ваша реализация Singleton далеко не безопасна - ваш объект может быть создан с помощью отражения, вы можете создать синглтон на основе enum

3 голосов
/ 14 мая 2010

Singleton singleton = Singleton.getInstance(); должно работать - эта ошибка не имеет смысла, учитывая ваш код; Вы уверены, что сообщаете об этом правильно? (Это имело бы смысл, если бы вы забыли сделать метод getInstance статическим, что вы сделали в коде выше.)

Код, который вы дали нам для класса, правильный.

Наконец, одно концептуальное примечание: во-первых, вы не «создаете объект класса Singleton» - в этом весь смысл Singleton. :) Вы просто получаете ссылку на существующий объект.

2 голосов
/ 04 сентября 2012

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

Singleton singleton = Singleton.getInstance();

Правильный способ доступа к любому объекту singletonObject.

2 голосов
/ 14 мая 2010
  1. , поскольку конструктор является закрытым, не имеет смысла создавать объект с помощью конструктора.
  2. вы должны использовать public static Singleton getInstance(), но реализация не очень правильная.

    if (instance == null) {<br> instance = new Singleton();<br> }<br> return instance;

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

2 голосов
/ 14 мая 2010

Этот:

 Singleton singleton = Singleton.getInstance();

должен работать.Вот как вы вызываете статические методы в Java.И метод getInstance() объявлен как static.Вы уверены, что используете тот же класс Singleton?Или, может быть, вы импортировали класс с таким же именем в другой пакет.

1 голос
/ 11 февраля 2014

Все еще возможно создать более одного экземпляра класса, как показано ниже:

Singleton.getInstance().clone()
1 голос
/ 14 мая 2010

В использовании

нет ничего плохого
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

Это способ получить одноэлементный объект из класса. Должно быть что-то еще. Пожалуйста, опубликуйте более подробную информацию

0 голосов
/ 18 января 2013

, поскольку метод getInstance () является «статическим» и также является полем экземпляра, вы можете использовать Singleton.getInstance (); Без создания нового образца класса. Это место синглетона

...