2009-07-15 2 views
5

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

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

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

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

+0

Является ли внутренний класс статическим? – skaffman

+0

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

+1

вы должны сделать его статическим. – Ron

ответ

7

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

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

+0

@Christian: Если вы измените первую фразу на: «Если внутренний класс может использоваться только внешним классом ...» Я сделаю это принятым ответом. – user128807

+1

Замечание Карлоса Хеубергера в исходном вопросе. Также обратите внимание, что эта ошибка, вероятно, была сгенерирована статическим анализатором Enerjy - см. Ответ VonC. – user128807

7

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

+1

Я нашел это, когда сделал GOOG для «JAVA0043», который повторяет то, что сказал Карл: http://www.enerjy.com/explorer/help/rules/JAVA0043.html – seth

+0

Я понимаю, что это может зависеть от его собственной, но если я хочу попрактиковаться в хорошей информации, тогда я должен держать его как внутренний класс. Правильно? – user128807

+0

Да; иногда сохранение его как частного статического внутреннего класса может быть лучшим вариантом. Но для тестируемости класс высшего уровня может быть предпочтительнее. –

1

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

+3

Если вы не используете внешний класс, сделайте его закрытым * статическим * классом. – notnoop

11

Похоже на Enerjy Error:

// 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; 
    } 
    } 
} 
+0

Да, я считаю, что эта ошибка была создана Enerjy. – user128807

5

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

Смежные вопросы