Статический класс с загрузкой статических переменных - это своего рода уловка.
/**
* 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;
}
Можно сделать что-то подобное со статическим классом, но при косвенной отправке будут накладные расходы на вызовы.
Вы можете получить экземпляр и передать его функции в качестве аргумента. Это позволяет направить код на «правильный» синглтон. Мы знаем, что вам понадобится только одна из них ... пока вы этого не сделаете.
Большим преимуществом является то, что синглтоны с отслеживанием состояния можно сделать потокобезопасными, тогда как статический класс не может, если вы не измените его как секретный синглтон.