Создание статической ссылки по сравнению с одиночным - PullRequest
6 голосов
/ 02 декабря 2011

Я использую драйвер java для mongodb, и в документации сказано:

«Вы должны создать один экземпляр Mongo и использовать его при каждом запросе.»

Использование одного экземпляра звучит как синглтон.

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

Может кто-нибудь объяснить разницу между одноэлементным и созданием статической ссылки?

Таким образом, фактический код, который мне нужно создать либо статически, либо через синглтон, был бы:

Mongo m = new Mongo( "localhost" , 27017 );

Может ли кто-нибудь объяснить оба метода и основные различия, если таковые имеются?

Ответы [ 5 ]

4 голосов
/ 02 декабря 2011

В Java вы обычно используете статическую переменную для реализации шаблона Singleton.

http://java.sun.com/developer/technicalArticles/Programming/singletons/

3 голосов
/ 02 декабря 2011

У вас есть 3 проблемы: синглтон, статическая ссылка и потокобезопасность.

У вас есть синглтон, если вы можете создать только один экземпляр класса. Это полезно, так как если бы у вас было два экземпляра Mongo, все могло бы испортиться. Однако вы не можете внедрить шаблон одноэлементного проектирования для Mongo в своем коде: вы можете вызвать new Mongo() в любом месте и создать столько экземпляров, сколько захотите. Вы просто должны быть осторожны, вы не делаете этого, но это не должно быть очень сложно.

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

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

  private MyClass() {...}   // !!private, not accessible

  public MyClass getSingleton() { return SINGLETON; }
}

И у вас будет только один единственный экземпляр MyClass, поскольку конструктор является закрытым, и единственный способ получить экземпляр - через MyClass.getSingleton(). Очевидно, монгольский дизайнер должен был бы спроектировать класс Mongo как таковой; Вы ничего не можете сделать, чтобы сделать его одиноким.

Что касается безопасности потоков, я не совсем вижу связь с синглтоном. Класс синглтона должен быть безопасным для потоков: если многие потоки изменяют и читают состояние синглтона, вам необходима правильная синхронизация, чтобы все потоки видели одинаковые значения. Я не знаю Mongo, но держу пари, что это класс с поддержкой потоков.

2 голосов
/ 02 декабря 2011

Singleton - это шаблон проектирования , где у вас есть один экземпляр объекта, который используется совместно с остальным кодом.Статические переменные являются функцией языка Java .

. Для реализации Singleton вы обычно используете статические переменные.

0 голосов
/ 11 марта 2013

Если только один класс использует ваш одноэлементный объект, то нет видимой разницы в количестве созданных объектов.

Предполагается, что вам нужен объект classASing с использованием подхода Singleton

ClassASing {
     private static ClassASing obj = new ClassASing();
     private ClassAsing(){...}
     public static ClassASing getNewObject(){
          return obj;
     }
}

Использование Singletonподход

ClassB{
    private ClassASing singObj = ClassASing.getNewObject();
}
  • независимо от того, сколько экземпляров ClassB создано, все они будут использовать один и тот же объект ClassASing

с использованием статической ссылки

ClassB{
    private static ClassA sObj = new ClassA();
}

* независимо от того, сколько экземпляров ClassB создано, все они будут использовать одну и ту же ссылку, указывающую на один и тот же объект.

Здесь нет большой разницы: 1 объект используется в обоих случаях.

Теперь, если вы рассмотрите еще один sencario, который вам нужен объект в двух ваших классах.

синглтонный подход

ClassB1{
            private ClassASing singObj1 = ClassASing.getNewObject();
        }

ClassB2{
            private ClassASing singObj2 = ClassASing.getNewObject();
        }
  • независимо от того, сколько экземпляров ClassB1 создано, все они будутиспользовать один и тот же объект ClassASing
  • независимо от того, сколько экземпляров ClassB2 создано, все они будут использовать один и тот же объект ClassASing-омв ClassB1 уже используется, поэтому только один объект ClassASing

Статический эталонный подход

ClassB1{
    private static ClassA sObj1 = new ClassA();
}

ClassB2{
    private static ClassA sObj2 = new ClassA();
}
  • независимо от того, сколько созданных экземпляров ClassB1 будет создано, все они будут использоватьодна и та же ссылка sobj1, указывающая на один и тот же объект
  • , независимо от того, сколько экземпляров созданного ClassB2 все они будут использовать одну и ту же ссылку sobj2, указывающую на один и тот же объект, но этот объект отличается от того, который создан в ClassB1, так что теперьу вас есть два объекта класса А.
0 голосов
/ 02 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...