Одноэлементный класс (изменить: сравнить с экземпляр 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();
все ставки выключены)
Чем более правильный способ объявить класс чтобы избежать других случаев, это объявить его окончательным. Вы даете ему частный конструктор, чтобы он также не мог быть создан. (Любой класс или класс с частным конструктором (или, скорее, нулевые не-частные конструкторы) достаточно, чтобы класс не переопределялся.)
Во-первых, одиночные игры необязательно должны быть реализованы как классы со статическими методы. Во-вторых, когда само создание объекта тяжелое (CPU/network/etc), вы хотите контролировать количество создаваемых экземпляров, например, например, pool-pool. – alfasin
Потому что, если ваш конструктор является общедоступным, любой может его называть, и, таким образом, создавать другие экземпляры вашего синглтона, который побеждает цели одного сингла. Если создание нескольких экземпляров не является проблемой, зачем делать это синглом в первую очередь? Если все статично, зачем создавать один экземпляр? –
Это даже не singleton.'instance' недоступен без создания экземпляра 'DBSingleton', который, в свою очередь, не может быть выполнен, поскольку конструктор является закрытым. Вероятно, вы имели в виду 'public static DBSingleton getInstance()' – Paul