Klasa statyczna z ładunkiem zmiennych statycznych to trochę hack.
/**
* 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;
}
}
Singleton z aktualną instancją jest lepszy.
/**
* 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;
}
}
Stan jest TYLKO w instancji.
Tak więc singleton może zostać później zmodyfikowany, aby wykonać pulę, wystąpienia lokalne wątku itp. I żaden z już napisanych kodów nie musi być zmieniany, aby uzyskać korzyści.
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;
}
Możliwe jest zrobienie czegoś podobnego z klasą statyczną, ale w pośrednim wysyłaniu będzie narzut na wywołanie.
Możesz pobrać instancję i przekazać ją do funkcji jako argument. Pozwala to na przekierowanie kodu do „właściwego” singletona. Wiemy, że będziesz potrzebować tylko jednego ... dopóki tego nie zrobisz.
Dużą zaletą jest to, że stanowe singletony mogą być bezpieczne dla wątków, podczas gdy statyczna klasa nie może, chyba że zmodyfikujesz ją tak, aby była tajnym singletonem.