나는 블로킹 큐에서 읽는 스레드를 제어하는 것에 대해 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
은 상당히 복잡한 클래스입니다. 그것은 불변이므로 몇몇 인수를 취하는 생성자를가집니다. 인수가없는 생성자를 추가하려면 여러 필드를 초기화하지 않거나 null로두면 메서드가 다른 곳에서 사용 된 경우 메서드가 중단됩니다. Foo
은 MyThread
과 함께 사용되지 않습니다. 비슷하게, 더미 생성자를 주 생성자에 넣는 것은 몇몇 필드와 생성자 매개 변수 자체가 중요한 객체이기 때문에이 문제를 그냥 넘겨 줄 것입니다.
단순히 프로그래밍을 과도하게 방어합니까? 객체를 사용할 수있게 만드는 설정자가없는 경우에도 클래스에 인수가없는 생성자를 추가하는 것에 대해 걱정해야합니까? (다른 프로그래머가 해당 생성자를 사용하지 않을 정도로 충분히 유용하다고 가정 할 때)? 인수가없는 생성자 또는 적어도 값이 아닌 값을 가질 수없는 경우 Foo
의 디자인이 손상 되었습니까? 모든 방법에서 if(someField == null){throw new RuntimeException();}
검사를 사용하는 것이 더 낫습니까?