私の同僚は、Eclipseのコードフォーマットと警告の設定のいくつかをより厳密にすることを提案しました。これらの変更の大部分は理にかなっていますが、Javaでこの1つの奇妙な警告が表示されます。「問題」を再現するためのテストコードは次のとおりです。
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); // !!!
this.anInstance.doSomething();
}
}
// using "this.anInstance" instead of "anInstance" prevents another warning,
// Unqualified access to the field WeirdInnerClassJavaWarning.anInstance
!!!とのライン 新しい警告設定を使用して、Eclipseでこの警告が表示されます。
囲んでいるコンストラクターWeirdInnerClassJavaWarning.InnerClass()へのアクセスは、合成アクセサーメソッドによってエミュレートされます。可視性を高めると、パフォーマンスが向上します。
これは何を意味するのでしょうか?「プライベート静的クラス」を「保護された静的クラス」に変更すると、警告が消えます。これは私には意味がありません。
編集:私はついに「正しい」修正を見つけました。ここでの本当の問題は、このネストされたプライベート静的クラスにパブリックコンストラクターがないことです。その1つの調整により、警告が削除されました。
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
public InnerClass() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass();
this.anInstance.doSomething();
}
}
クラスをプライベートのネストされたクラスにし(したがって、囲んでいるクラスのサブクラスを含め、他のクラスがそのクラスにアクセスできないようにします)、静的クラスにします。
ネストされたクラスをプライベートではなく保護することが「問題」を修正する別の方法である理由はまだわかりませんが、それはEclipseの癖/バグかもしれません。
(申し訳ありませんが、より明確にするために、InnerClassではなくNestedClassと呼ぶべきでした。)