2013-11-28 99 views
0

所以,我有我使用一個通用的游泳池,我想知道什麼是真正發生在初始化?是否創建了一位教師並將其傳遞給池以便使用,如果是這樣的話,它具有哪些成本?泛型類 - 初始化在Java中

final Pool<Teacher> pool = new Teacher(); 

注:池是一個抽象類&教師擴展游泳池 提前感謝!

這裏的游泳池類:

public abstract class ObjectPool<T> { 
private long expirationTime; 

private Hashtable<T, Long> locked, unlocked; 

public ObjectPool() { 
expirationTime = 30000; // 30 seconds 
locked = new Hashtable<T, Long>(); 
unlocked = new Hashtable<T, Long>(); 
} 

protected abstract T create(); 

public abstract boolean validate(T o); 

public abstract void expire(T o); 

public synchronized T checkOut() { 
long now = System.currentTimeMillis(); 
T t; 
if (unlocked.size() > 0) { 
    Enumeration<T> e = unlocked.keys(); 
    while (e.hasMoreElements()) { 
    t = e.nextElement(); 
    if ((now - unlocked.get(t)) > expirationTime) { 
     // object has expired 
     unlocked.remove(t); 
     expire(t); 
     t = null; 
    } else { 
     if (validate(t)) { 
     unlocked.remove(t); 
     locked.put(t, now); 
     return (t); 
     } else { 
     // object failed validation 
     unlocked.remove(t); 
     expire(t); 
     t = null; 
     } 
    } 
    } 
} 
// no objects available, create a new one 
t = create(); 
locked.put(t, now); 
return (t); 
} 

public synchronized void checkIn(T t) { 
locked.remove(t); 
unlocked.put(t, System.currentTimeMillis()); 
} 
} 
+2

那是不行的,除非'Teacher'延伸'Pool'(或工具) – Justin

+0

這段代碼編譯?這些課程如何看待? –

+0

是的,只要老師擴展池並實現抽象方法,它就可以編譯並運行正常。 – user1861156

回答

2

假設Pool是用於存儲對象的數據結構,你可能想初始化Pool代替

final Pool<Teacher> pool = new Pool<>(); 

如果你有一個游泳池讓老師有無論如何,這似乎有些尷尬和不必要。

編輯:基於您的更新問題

,我會說一點分開的類成池(經理)班,和該池對象將實現一個接口。然後你的泛型類:

public class Pool<T extends PoolObject> {//... 

從那裏,你可以使用通用PoolObjects工作,老師不會直接實施/擴展池。

+0

我同意它很尷尬,但'pool'包含抽象方法。 – user1861156

+0

你能向我們展示'Pool'類嗎? – Rogue

+0

是的,我現在已經這樣做了。 – user1861156