Singleton - очень распространенный шаблон и может помочь вам разобраться только с одним экземпляром объекта во всей среде выполнения. Так что не бойтесь отличать статические и нестатические методы ... делайте все их нестационарными, потому что если они вызовут их только City.getInstance().method()
, и вы уверены, что метод() (и любой другой метод) будет вызывается только в одном экземпляре.
Предыдущий ответ верный, но вы должны реализовать singleton по-другому, если вы находитесь в многопоточной среде (как веб-приложение), и вам нужно убедиться, что будет создан только один экземпляр.
Infact, в коде prevoius возможно, что несколько параллельных потоков создадут новый экземпляр города ... Созданные позже потоки будут использовать последний экземпляр (потому что он переопределяет первый в статическом поле).
Есть несколько вариантов путепровода этой проблемы ... наиболее распространенным является, чтобы сделать synchronized
в getInstance()
методе:
public static synchronized City getInstance() {
Наиболее эффективные (в высокой одновременно среде) является использование ленивой инициализации:
public class City {
private static volatile City instance;
public static City getInstance() {
if(instance == null) {
synchronized (City.class) {
if(instance == null) {
instance = new City();
}
}
}
return instance;
}
private City() {
... construct city here ....
}
// your City instance methods here (non-static)
....
}
Где-то я вижу другую реализацию на основе инициализации на классе только «по требованию» ...
Поделитесь своим кодом .. сколько раз вы собираетесь звонить новым и из которого все места? – SMA