Мой коллега предложил сделать несколько настроек форматирования и предупреждения 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 более понятным.)