Hãy nêu một cách hiệu quả để triển khai một mẫu singleton trong Java?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
102 lượt xem
Java master

java5 sử dụng một enum:

public enum Elvis {
   INSTANCE;

   private final String[] favoriteSongs =
      { "Hound Dog", "Heartbreak Hotel" };
   public void printFavorites() {
      System.out.println(Arrays.toString(favoriteSongs));
   }
}

Cách tiếp cận này tương đương về mặt chức năng với cách tiếp cận public field, ngoại trừ nó ngắn gọn hơn, nó cung cấp miễn phí bộ máy tuần tự hóa và cung cấp sự đảm bảo vững chắc để chống lại việc khởi tạo nhiều lần, ngay cả khi đối mặt với các cuộc tấn công tuần tự hóa tinh vi hoặc reflection. Mặc dù cách tiếp cận này vẫn chưa được áp dụng rộng rãi, nhưng kiểu enum một phần tử là cách tốt nhất để triển khai một singleton.

Trước java5, trường hợp đơn giản nhất là:

public final class Foo {
   private static final Foo INSTANCE = new Foo();

   private Foo() {
      if (INSTANCE != null) {
         throw new IllegalStateException("Already instantiated");
      }
   }

   public static Foo getInstance() {
      return INSTANCE;
   }
 
   public Object clone() throws CloneNotSupportedException{
      throw new CloneNotSupportedException("Cannot clone instance of this class");
   }
}
{{login.error}}