Мой коллега предложил сделать несколько настроек форматирования кода и предупреждений в Eclipse более строгими. Большинство этих изменений имеют смысл, но я получаю одно странное предупреждение в Java. Вот некоторый тестовый код для воспроизведения «проблемы»:
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 ()
эмулируется синтетическим аксессором
метод. Увеличение его видимости будет
улучшить свои показатели.
Что это значит? Предупреждение исчезает, когда я меняю «закрытый статический класс» на «защищенный статический класс», что для меня не имеет смысла.
edit: Я наконец-то понял "правильное" исправление. Реальная проблема здесь заключается в том, что в этом вложенном приватном статическом классе отсутствует общедоступный конструктор. Этот твик убрал предупреждение:
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.
(извините, я должен был назвать его NestedClass вместо InnerClass, чтобы быть более понятным.)