Une classe statique avec une charge de variables statiques est un peu un 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;
}
}
Un singleton avec une instance réelle est mieux.
/**
* 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;
}
}
L'état est UNIQUEMENT dans l'instance.
Ainsi, le singleton peut être modifié plus tard pour faire du pooling, des instances locales de thread, etc.
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;
}
Il est possible de faire quelque chose de similaire avec une classe statique, mais il y aura une surcharge par appel dans la distribution indirecte.
Vous pouvez obtenir l'instance et la transmettre à une fonction en tant qu'argument. Cela permet au code d'être dirigé vers le «bon» singleton. Nous savons que vous n'en aurez besoin que d'un seul ... jusqu'à ce que vous n'en ayez pas besoin.
Le gros avantage est que les singletons avec état peuvent être rendus sûrs pour les threads, alors qu'une classe statique ne le peut pas, à moins que vous ne le modifiiez pour être un singleton secret.