1. ホーム
  2. java

[解決済み] コンストラクタの警告で漏れる

2023-05-01 22:50:31

質問

私は、Netbeans 6.9.1の警告を(ほとんど)避けたいと思っています。 'Leaking this in constructor' 警告があります。

コンストラクタでメソッドを呼び、"を渡すという問題は理解できました。 this "は危険です、なぜなら" this は完全に初期化されていない可能性があるため、危険です。

コンストラクタはプライベートで、同じクラスからしか呼び出されないので、私のシングルトンクラスの警告を修正するのは簡単でした。

古いコード(簡略化)です。

private Singleton() {
  ...
  addWindowFocusListener(this);
}

public static Singleton getInstance() {

  ...
  instance = new Singleton();
  ...
}

新しいコード(簡略化)。

private Singleton() {
  ...
}

public static Singleton getInstance() {

  ...
  instance = new Singleton();
  addWindowFocusListener( instance );
  ...
}

コンストラクタがpublicで他のクラスから呼び出される可能性がある場合、この修正はうまくいきません。どのようにすれば、以下のコードを修正することができるでしょうか。

public class MyClass {

  ...
  List<MyClass> instances = new ArrayList<MyClass>();
  ...

  public MyClass() {
    ...
    instances.add(this);
  }

}

もちろん、私はこのクラスを使っているすべてのコードを修正する必要がないような修正を望んでいます(たとえばinitメソッドを呼び出すことで)。

どのように解決するのですか?

というように instances.add(this) をコンストラクタの末尾に置いたので の警告を表示しないようにコンパイラに指示しても問題ないでしょう。 (*) . 警告はその性質上、必ずしも何か問題があることを意味するものではなく、注意を要するだけです。

もし自分が何をしているのかわかっていれば @SuppressWarnings アノテーションを使用することができます。Terrelが彼のコメントで言及したように、NetBeans 6.9.1では以下のアノテーションがそれを行う。

@SuppressWarnings("LeakingThisInConstructor")

(*) 更新しました。 IstharとSergeyが指摘したように、quot;leaking"コンストラクタのコードが(あなたの質問のように)完全に安全に見えてもそうでない場合があります。これを承認してくれる読者はもっといるのでしょうか?私は言及された理由でこの回答を削除することを検討しています。