Tôi có một số lớp được sử dụng làm Singletons. Họ chia sẻ một số chức năng cơ bản và mở rộng cùng một tổ tiên từ một thư viện mà lần lượt không thường được sử dụng như một Singleton.Làm thế nào tôi có thể có một Singleton có nguồn gốc từ một loại cơ sở trừu tượng trong Java?
Nếu tôi đặt chức năng chung trong một lớp cơ sở kế thừa từ tổ tiên chung, tôi nhận được một lớp không có ý nghĩa để khởi tạo, vì vậy tôi đã làm cho nó trừu tượng. Ngoài ra, vì tất cả các lớp đều được sử dụng như là Singletons, tất cả chúng nên có phương thức init() và getInstance(), cả hai đều là tĩnh. Tất cả các nhà thầu đều không phải là công khai.
Bây giờ, kể từ khi static
là một modifier bất hợp pháp cho các phương pháp trừu tượng, sau đây không làm việc, mặc dù điều này sẽ được chính xác những gì tôi muốn:
class Base extends LibraryClass {
protected Base() {
// ... constructor
}
// ... common methods
// ILLEGAL!
public static abstract void init();
public static abstract <T extends Base>T getInstance();
}
class A extends Base {
private static A _INSTANCE;
private A() {
super();
}
public static void init() {
_INSTANCE = new A();
}
public static A getInstance() {
return _INSTANCE;
}
}
Tôi chỉ có thể bỏ qua các dòng bất hợp pháp ở cơ sở và được thực hiện với nó. Nhưng làm thế nào để tôi thể hiện rằng mọi trẻ em của Base phải đều có những phương pháp này?
Tại sao chúng ta cần Singleton mặc dù chúng ta đã có Static hoặc Final trong Java? sự từ chức chính/nguyên nhân buộc chúng tôi phải chấp nhận "Singleton" thay vì "tĩnh, cuối cùng"? Mặc dù để đạt được Singleton chúng tôi sử dụng tĩnh.Tôi không thể hiểu câu đố này. Vui lòng chuyển nhận xét của bạn. –
tĩnh cuối cùng là cho các hằng số được tạo ra háo hức. Một singleton thường được tạo ra lười biếng (chỉ khi nó là cần thiết). Ngoài ra, tĩnh cuối cùng không cho phép thay thế "hằng số" bằng mockup. Vì vậy, họ làm cho thử nghiệm cứng hoặc thậm chí không thể. –
Xem http://stackoverflow.com/questions/11831/singletons-good-design-or-a-crutch –