Подтвердить что ты не робот

Шаблон Java Singleton

Изменить: Answered - ошибка была методом не статична

Я использую шаблон дизайна 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

4b9b3361

Ответ 1

Singleton singleton = Singleton.getInstance();

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

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

Ответ 2

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

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

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

Ответ 3

Этот:

 Singleton singleton = Singleton.getInstance();

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

Ответ 4

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

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

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

Ответ 5

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

Singleton singleton = Singleton.getInstance();

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

Ответ 6

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

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

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

Ответ 7

По-прежнему возможно создать несколько экземпляров класса, как показано ниже:

Singleton.getInstance().clone()

Ответ 8

так как метод getInstance() также является "статическим" и поле экземпляра, yo может использовать Singleton.getInstance(); Без создания нового класса. Thihs является покой одиночной