Вы когда -нибудь нужно уничтожить экземпляр Синглтона?

StackOverflow https://stackoverflow.com/questions/5342357

Вопрос

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

У меня есть Singleton Dbmanager, который управляет операциями JDBC Connection и запроса. Называя его статический метод NewInstance, я могу получить его экземпляр, затем я делаю несколько запросов. Наконец, я хочу закрыть подключение к базе данных, и я вызываю еще один статический метод, чтобы закрыть соединение JDBC.

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

Если я назначу этот экземпляр NULL, то снова позвоните в метод NewInstance, получу ли я еще один новый экземпляр?

Это было полезно?

Решение

Я бы не стал задержаться в семантике «Синглтона» - ваше требование состоит в том, что в большинстве случаев DBManager существуют в любое время. Как только этот экземпляр будет сделан бесполезным, вы можете либо уничтожить его, чтобы по требованию был создан свежий экземпляр, либо определить свой newInstance Метод (который я мог бы предложить переименовать getInstance) сделать исключение (возможно IllegalStateException), если его называют после того, как Синглтон был сделан бесполезным.

Если вы собираетесь уничтожить его, когда сделано бесполезным, я полагаю, что это будет сделано в классе Синглтона автоматически, без внешней помощи. Вам также следует подумать о том, чтобы полностью скрыть синглтон DBManager и вместо этого внедрить шаблон делегирования. Это позволит избежать проблемы клиента, сохраняющего ссылку на устаревшую DBManager пример. Затем вы можете сделать объект делегата обычным синглтоном.

Другие советы

Я бы сказал об этом нет, Вы не можете уничтожить Синглтон, потому что должен быть ровно один экземпляр его всегда. И, возможно, это должен быть один и тот же экземпляр, потому что в противном случае это не на самом деле одно один (например, два разных класса могут иметь ссылки на различные экземпляры класса).

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

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

Я думаю, что было бы в большей степени в соответствии с шаблоном Singleton, чтобы DBManager способным открывать и закрывать связь, фактически не разрушая самого DBManager. Затем вы будете держать его вокруг до тех пор, пока в следующий раз вам понадобится подключение к базе данных, и спросите тот же объект DBManager, чтобы создать новое соединение. В конце концов, если это DBManager, он управляет соединениями; Это не представляет какого -либо отдельного соединения.

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

На бассейне будет настройка IDLE_CONNECTION_TIMEOUT или аналогично, что будет автоматически истекать и закройте соединения, если они не используются в течение настроенного периода времени. Так что для разработчика мало что может беспокоиться в таких случаях.

Короткий ответ: Нет.

Более длинный ответ: вы не можете уничтожить синглтона, кроме как использовать специальный загрузчик класса. Если вам нужно уничтожить его, вам вообще не следует использовать синглтон. Может быть, вы сможете переписать его таким образом, чтобы открыть его - лучше: избегайте синглтонского рисунка.

Поиск анти -шаблона или запах кода.

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

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

Ваш класс DBManager должен обрабатывать очистку, если соединение DB закрыто. т.е. Если у DBManager есть направление на класс подключения, то вы можете написать код в методе NewInstance (), чтобы проверить, является ли подключение живым, затем верните статическую ссылку. что-то вроде этого:

static DBManager manager;
static DBManager newInstance(){
if (manager == null) manager =new DBManager();
else if ( manager !=null && connection ==null) //if connection is closed 
manager =new DBManager();

return manager;
}

Создайте Getter/Setter для переменной класса и установите ее yull, чтобы повторно устроить объект Ex:

//Singleton support ...
private static A singleton = null;
    public static A get() {
        if (singleton == null){
        singleton = new A();
    }
        return singleton;
}
public static A getSingleton() {
    return singleton;
}
public static void setSingleton(A singleton) {
    A.singleton = singleton;
}

//Re instantiate 
public class Test(){
....
....
    A.setSingleton(null);

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top