Шаблон "одиночка" Java

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

Я используюсь Шаблон разработки Singleton

 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

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

Спасибо, Spencer

17
задан Spencer 14 May 2010 в 06:49
поделиться

5 ответов

Singleton singleton = Singleton.getInstance();

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

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

26
ответ дан 30 November 2019 в 11:43
поделиться

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

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

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

3
ответ дан 30 November 2019 в 11:43
поделиться

Этот:

 Singleton singleton = Singleton.getInstance();

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

2
ответ дан 30 November 2019 в 11:43
поделиться
  1. поскольку конструктор является приватным, не имеет смысла создавать объект с помощью конструктора.
  2. вы должны использовать public static Singleton getInstance(), но реализация не очень корректна.

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

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

2
ответ дан 30 November 2019 в 11:43
поделиться

Нет ничего плохого в использовании

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

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

1
ответ дан 30 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

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