如何防止 клонирование для изменения шаблона класса Singleton на Java?


Шаблон Singleton утверждает, что у класса может быть один экземпляр, не разрешается создавать несколько экземпляров. Для этого мы делаем конструктор класса закрытым и возвращаем экземпляр с помощью статического метода. Однако используя клонирование, мы все еще можем создать несколько экземпляров класса. См. пример ниже:

Пример: создание шаблона Singleton

Интерактивная демонстрация

public class Tester{
   public static void main(String[] args) 
      throws CloneNotSupportedException { 
      A a = A.getInstance();
      A b = (A)a.clone();

      System.out.println(a.hashCode());
      System.out.println(b.hashCode());
   }
}

class A implements Cloneable {
   private static A a; 
   private A(){}

   public static A getInstance(){
      if(a == null){
         a = new A(); 
      }
      return a;
   } 

   @Override
   protected Object clone() 
      throws CloneNotSupportedException {
      return super.clone();
   }
}

Вывод

705927765
366712642

Здесь вы можете заметить, что мы создали другой объект класса Singleton. Давайте посмотрим, как избежать такой ситуации:

Верните тот же объект также в методе клонирования.

Пример: защита шаблона Singleton

@Override
protected Object clone() 
throws CloneNotSupportedException {
   return getInstance();
}

Вывод

705927765
705927765

Обновлено: 30 июля 2019 г.

263 просмотра

開啟你的 職業生涯

完成課程即可獲得認證

開始學習
廣告