2015-03-28 2 views
0

Я использовал класс под названием «Город» &, на нем будет всего 1 город; будет полезно создать экземпляр, если только 1 или одноэлементный.Создание только 1 экземпляра или синглтона

Сам класс будет содержать методы, которые не все будут статическими, & Я читал, что сами синглтоны состоят из статических атрибутов и методов & может быть плохой практикой или я ошибаюсь?

+1

Поделитесь своим кодом .. сколько раз вы собираетесь звонить новым и из которого все места? – SMA

ответ

0

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) 
    .... 

} 

Где-то я вижу другую реализацию на основе инициализации на классе только «по требованию» ...

0

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

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

0

Одиночные игры - очень распространенный образец.

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

public class City { 

    private static City SINGLETON; 

    public static City get() { 
     // lazy construction, may be required to synchronize.... 
     if(SINGLETON == null) { 
      SINGLETON = new City(); 
     } 

     return SINGLETON; 
    } 

    private City() { 
     ... construct city here .... 
    } 

    // your City instance methods here (non-static) 
    .... 

} 

Если у вас есть каркас инъекции зависимостей, вы можете использовать его для управления экземпляром singleton для вас.

0

Лучший механизм одноточечно доступен сегодня

public enum City { 

    INSTANCE; 

} 

Затем вы обращаетесь к примеру, как так

City.INSTANCE; 

А если вам нужно больше методов в вашем городе вы

public enum City { 

    INSTANCE; 

    private int xLoc; 

    public int getX() { 
    return xLoc; 
    } 
} 

сингл объект с техникой «охранник» ошибочен.Хотя у них есть фиксированные JVM, поэтому условие гонки не гарантирует, что два экземпляра сделаны (при том, что один из них был собран мусором), ни один из этих примеров не обрабатывает различные другие способы создания дубликатов вашего экземпляра.

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

+0

Лично я считаю, что одноточие является запахом кода. Я довольно экстремальный, когда вы совмещаетесь с OO, и мне еще предстоит найти ситуацию, когда использование одноэлементного не может быть заменено неспециализированным классом. Да, вам, возможно, придется сделать доступ к нему явным через конструктор или методы, но вы хотите это сделать, потому что тогда вы будете знать, что используете, просматривая API, а не фактический исходный код. –

Смежные вопросы