Статичний клас із навантаженням статичних змінних - трохи хак.
/**
* 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;
}
}
Краще одиничне з фактичним екземпляром.
/**
* 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;
}
}
Штат знаходиться ТІЛЬКИ в інстанції.
Отже, синглтон може бути змінений пізніше для об’єднання, локальних екземплярів і т.д. І жоден із уже написаних кодів не повинен змінюватися, щоб отримати вигоду.
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;
}
Можна зробити щось подібне зі статичним класом, але в непрямому відправленні будуть витрати на виклик.
Ви можете отримати екземпляр і передати його функції як аргумент. Це дозволяє спрямовувати код у "правий" синглтон. Ми знаємо, що вам знадобиться лише один ... поки цього не зробите.
Велика перевага полягає в тому, що одиночні елементи, що містять державні дані, можна зробити безпечними для потоків, тоді як статичний клас не може, якщо ви не модифікуєте його як секретний синглтон.