Что не так с внутренним классом, не использующим внешний класс в Java?

StackOverflow https://stackoverflow.com/questions/1132930

  •  16-09-2019
  •  | 
  •  

Вопрос

Я использую статический анализатор в Eclipse для проверки моего кода.У одного класса, foo, есть внутренний класс bar.Я получаю следующую ошибку:

JAVA0043 Inner class 'bar' does not use outer class 'foo'

Почему это ошибка?Пока внешний класс использует внутренний класс, разве этого недостаточно, чтобы сделать это сокрытие информации полезным и правильным?

Внутренний класс не является статичным.

Это было полезно?

Решение

Если внутренний класс может использоваться только внешним классом, но при этом внутреннему классу не нужна ссылка на внешний класс, тогда вы можете создать его private static.

Если внутренний класс известен кому-то другому, кроме внешнего класса, то с таким же успехом он может быть самостоятельным классом верхнего уровня.

Другие советы

Выглядит как Ошибка Enerjy:

// Incorrect
class Log {
  // Position never uses the enclosing Log instance,
  // so it should be static
  class Position {
    private int line;
    private int column;
    Position(int line, int column) {
      this.line = line;
      this.column = column;
    }
  }
}

Вложенный класс , который не использует никаких переменных экземпляра или методов ни из одного из своих внешних классов может быть объявлен статическим.
Это уменьшает зависимость между двумя классами, что улучшает читаемость и обслуживание.

// Correct
class Log {
  static class Position {
    private int line;
    private int column;
    Position(int line, int column) {
      this.line = line;
      this.column = column;
    }
  }
}

Если он не содержит никаких ссылок на внешний класс, с таким же успехом это мог бы быть полноценный, обычный класс.Поскольку он не зависит от внешнего класса, он может работать сам по себе.Я подозреваю, что это и есть причина "ошибки".

Нестатический внутренний класс имеет неявную ссылку на экземпляр своего внешнего класса.Эта скрытая ссылка может задержать (или даже предотвратить) сборку мусора во внешнем классе и создать проблемы с сериализацией.Таким образом, вы должны использовать нестатические внутренние классы только тогда, когда они вам нужны.Легко забыть объявить класс static, поэтому анализ кода предупреждает вас, когда он не нужен.

Весь смысл внутреннего класса в том, что у него есть доступ к внешнему классу.Если ты на самом деле не используя внешний класс, просто сделайте его обычным, полноценным классом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top