バグや悪い習慣を見つけるために、自分のコードでFindBugsを実行することに慣れています。今日、クラスコンストラクターでスレッドを開始しているという事実に文句を言います。
本当に悪いことですか?理由を説明していただけますか?
クラスが final である場合、少なくとも安全ですか?
編集:
スレッドは内部クラスとして実装され、開始時にすでに初期化されているメイン クラスのフィールドのみを使用します。
public final class SingletonOuter {
private static SingletonOuter ourInstance = new SingletonOuter();
public static SingletonOuter getInstance() {
return ourInstance;
}
private final SomeOtherClass aField;
private SingletonOuter() {
aField=new SomeOtherClass();
thread=new InnerThread();
thread.start();
}
private boolean pleaseStop;
private synchronized boolean askedStop(){return pleaseStop;}
public synchronized void stop(){
pleaseStop=true;
}
private final InnerThread thread ;
private class InnerThread extends Thread{
@Override public void run() {
//do stuff with aField until askedStop()
}
}
}
編集:
最後にスレッドの開始を getInstance メソッドに移動して、将来のバグが発生する可能性を回避します。
public final class SingletonOuter {
private static SingletonOuter ourInstance
public static SingletonOuter getInstance() {
if (ourInstance==null){
ourInstance= = new SingletonOuter();
ourInstance.thread.start();
}
return ourInstance;
}
private final SomeOtherClass aField;
private SingletonOuter() {
aField=new SomeOtherClass();
thread=new InnerThread();
}
...