Statik değişkenler içeren statik bir sınıf, biraz hacklemektir.
/**
* 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;
}
}
Gerçek bir örneğe sahip bir singleton daha iyidir.
/**
* 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;
}
}
Eyalet YALNIZCA durumdadır.
Böylece, daha sonra havuzlama, iş parçacığı yerel örnekler vb. Yapmak için tekil değiştirilebilir. Ve zaten yazılmış kodların hiçbirinin fayda sağlamak için değiştirilmesi gerekmez.
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;
}
Statik bir sınıfla benzer bir şey yapmak mümkündür, ancak dolaylı gönderimde çağrı başına ek yük olacaktır.
Örneği alıp argüman olarak bir işleve geçirebilirsiniz. Bu, kodun "doğru" tektona yönlendirilmesini sağlar. Siz istemeyene kadar bunlardan sadece birine ihtiyacınız olacağını biliyoruz.
En büyük fayda, durum bilgisi olan tekillerin iş parçacığı güvenli hale getirilebilmesidir, oysa statik bir sınıf, siz onu gizli bir tekli olarak değiştirmedikçe bunu yapamaz.