2017-01-10 3 views
1
public class DBSingleton { 

private static DBSingleton instance = new DBSingleton(); 

private DBSingleton() { 
// why do we need this constructor 
} 
public static DBSingleton getInstance() { 
    return instance; 
} 
} 

Как мне может помочь частный конструктор?Частный конструктор в одиночном тоне

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

кто может дать мне разумный пример пожалуйста

+0

Во-первых, одиночные игры необязательно должны быть реализованы как классы со статическими методы. Во-вторых, когда само создание объекта тяжелое (CPU/network/etc), вы хотите контролировать количество создаваемых экземпляров, например, например, pool-pool. – alfasin

+2

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

+0

Это даже не singleton.'instance' недоступен без создания экземпляра 'DBSingleton', который, в свою очередь, не может быть выполнен, поскольку конструктор является закрытым. Вероятно, вы имели в виду 'public static DBSingleton getInstance()' – Paul

ответ

0

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

Если вы сделаете свой конструктор общедоступным, пользователи могут сделать DBSingleton singleton = new DBSingleton(), и ваш класс не будет Singleton!

+0

Да, но это не изменится, потому что статическое свойство java является общим для всех объектов. все поля были объявлены как статические, поэтому даже если пользователь выполнил DBSingleton singleton = new DBSingleton(), он будет иметь доступ к тем же полям. Я прав? –

+0

@ M.T no. Если все поля и методы являются статическими, нет никакого смысла создавать одноэлемент. Вам не нужен какой-либо экземпляр для доступа к статическим членам класса. Таким образом, создание одного сингла делает его очень запутанным и показывает отсутствие понимания. Создание частного конструктора и отсутствие какого-либо метода getInstance() дает понять, что вы никогда не должны создавать экземпляр класса. –

+0

* «все поля были объявлены как статические» *, это не путь в Java. Поскольку Java является языком OO, вы должны использовать объекты, чтобы воспользоваться полиморфизмом и абстракцией через интерфейсы. Если вы думаете, что это «overkill», то почему вы используете Java? Есть много не-OO-языков ... –

0

Одноэлементный класс (изменить: сравнить с экземпляр singleton - см. Комментарии) даже не обязательно необходимо создавать; достаточно дать ему частный конструктор и объявить все остальные методы static, заставляя пользователя вызывать их в классе.

Конструктор должен быть закрытым, чтобы гарантировать, что класс является одноэлементным, независимо от того, создаете ли вы его один экземпляр. Если никакого частного конструктора не объявили, Java автоматически предоставит для него публичный конструктор no-arg.

Класс должен быть единственным экземпляром, предположительно для безопасности, а именно, в тех случаях, когда вы хотите вызывать методы, которые делают именно то, что они говорят. Если у вас есть экземпляр класса, который явно не сделан одиночным, тогда нет никакой гарантии, когда вы вызываете на нем методы, что он реализует реализацию singleton, потому что на самом деле у вас может быть подкласс DBSingleton, в котором указанный метод переопределяется , (Если вы вызываете их как DBSingleton.someMethod(), вы, конечно, получить ожидаемое поведение, но если вы делаете это:.

DBSingleton dbsInstance = DBSingleton.getInstance(); 
// ... all sorts of code, some of which might affect dbsInstance 
dbsInstance.someMethod(); 

все ставки выключены)

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

+0

Наличие класса с нулевым возможным экземпляром и только статическим методы в порядке, но это определенно не синглтон. –

+0

@JBNizet - это одноэлемент в том смысле, что пользователи могут использовать только класс (в качестве экземпляра) и не могут создавать несколько экземпляров одного и того же класса. – alfasin

+1

Ну, нет, они не могут использовать класс так же, как экземпляр класса: нет способа реализовать интерфейс, если у вас есть только статические методы. Невозможно расширить абстрактный класс. Нет способа сохранить экземпляр в коллекции и т. Д. И т. Д. В любом случае, singleton имеет точный смысл, который отличается от «класса полезности»? Использование одного слова для другого не несет ничего, кроме путаницы. –