我在問this有關控制從阻塞隊列讀取的線程的問題。雖然這不是我選擇去與解決方案,一些人建議,一個特殊的「毒丸」或「前哨」值添加到隊列關閉它,像這樣:雖然我喜歡無值的對象
public class MyThread extends Thread{
private static final Foo STOP = new Foo();
private BlockingQueue<Foo> blockingQueue = new LinkedBlockingQueue<Foo>();
public void run(){
try{
Foo f = blockingQueue.take();
while(f != STOP){
doSomethingWith(f);
f = blockingQueue.take();
}
}
catch(InterruptedException e){
}
}
public void addToQueue(Foo f) throws InterruptedException{
blockingQueue.put(f);
}
public void stop() throws InterruptedException{
blockingQueue.put(STOP);
}
}
這種做法,我決定不使用它,因爲我不確定STOP
字段使用什麼值。在某些情況下,很明顯 - 例如,如果您知道插入正整數,負數可以用作控制值 - 但Foo
是一個相當複雜的類。它是不可變的,因此有一個構造函數需要幾個參數。要添加無參數構造函數意味着將幾個字段保留爲未初始化或爲空,這會導致方法在其他地方使用時中斷 - Foo
不僅僅用於MyThread
。同樣,將虛擬值放入主構造函數中只會傳遞此問題,因爲幾個字段和構造函數參數本身都是重要的對象。
我只是簡單的過防守編程嗎?我應該擔心向類中添加無參數構造函數,即使沒有setter來使對象可用(假定其他程序員將足夠理智而不使用該構造函數)?如果Foo
的設計不能有無參數的構造函數或者至少有一個非值 - 那麼Foo
的設計是否會被破壞?在所有方法中放入if(someField == null){throw new RuntimeException();}
檢查會更好嗎?