Một lớp tĩnh có tải các biến tĩnh là một vấn đề khó.
/**
* Grotty static semaphore
**/
public static class Ugly {
private static int count;
public synchronized static void increment(){
count++;
}
public synchronized static void decrement(){
count--;
if( count<0 ) {
count=0;
}
}
public synchronized static boolean isClear(){
return count==0;
}
}
Một singleton với một phiên bản thực tế thì tốt hơn.
/**
* Grotty static semaphore
**/
public static class LessUgly {
private static LessUgly instance;
private int count;
private LessUgly(){
}
public static synchronized getInstance(){
if( instance==null){
instance = new LessUgly();
}
return instance;
}
public synchronized void increment(){
count++;
}
public synchronized void decrement(){
count--;
if( count<0 ) {
count=0;
}
}
public synchronized boolean isClear(){
return count==0;
}
}
Trạng thái CHỈ ở trong trường hợp.
Vì vậy, singleton có thể được sửa đổi sau đó để thực hiện các trường hợp gộp, luồng cục bộ, v.v. Và không mã nào trong số các mã đã được viết sẵn cần phải thay đổi để nhận được lợi ích.
public static class LessUgly {
private static Hashtable<String,LessUgly> session;
private static FIFO<LessUgly> freePool = new FIFO<LessUgly>();
private static final POOL_SIZE=5;
private int count;
private LessUgly(){
}
public static synchronized getInstance(){
if( session==null){
session = new Hashtable<String,LessUgly>(POOL_SIZE);
for( int i=0; i < POOL_SIZE; i++){
LessUgly instance = new LessUgly();
freePool.add( instance)
}
}
LessUgly instance = session.get( Session.getSessionID());
if( instance == null){
instance = freePool.read();
}
if( instance==null){
// TODO search sessions for expired ones. Return spares to the freePool.
//FIXME took too long to write example in blog editor.
}
return instance;
}
Có thể làm điều gì đó tương tự với một lớp tĩnh nhưng sẽ có chi phí cho mỗi cuộc gọi trong việc gửi gián tiếp.
Bạn có thể lấy thể hiện và chuyển nó vào một hàm làm đối số. Điều này cho phép mã được chuyển hướng đến singleton "bên phải". Chúng tôi biết bạn sẽ chỉ cần một trong số đó ... cho đến khi bạn không cần.
Lợi ích lớn là các singleton trạng thái có thể được tạo thành luồng an toàn, trong khi một lớp tĩnh không thể, trừ khi bạn sửa đổi nó thành một singleton bí mật.