O que está errado com uma classe interna não utilizando uma classe externa em Java?

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

  •  16-09-2019
  •  | 
  •  

Pergunta

Eu estou usando um analisador estático no Eclipse para examinar meu código. Uma classe, foo, tem uma classe interna, bar. Estou recebendo o seguinte erro:

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

Por que isso é um erro? Enquanto a classe externa usa a classe interna que não é suficiente para tornar esta informação escondendo útil e correto?

A classe interna não é estática.

Foi útil?

Solução

Se a classe interna sempre só poderá ser utilizado pela classe externa, mas a classe interna não precisa de referência para a classe externa, então você pode fazê-lo private static.

Se a classe interna é conhecido por alguém que não seja da classe externa, em seguida, ele poderia muito bem ser uma classe de nível superior em seu próprio direito.

Outras dicas

Parece um Enerjy Erro:

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

A classe aninhada que não usa quaisquer variáveis ??de instância ou métodos de qualquer de suas classes exteriores estáticas podem ser declaradas .
Isso reduz a dependência entre as duas classes, o que melhora a legibilidade e manutenção.

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

Se ele não está fazendo qualquer referência à classe externa, ele poderia muito bem ser uma classe full-on, regular. Uma vez que não é dependente da classe externa, ele pode ficar em sua própria. Eu suspeito que é a razão para o "erro".

Uma classe interna não-estática tem uma referência implícita a um exemplo da sua classe externa. Esta referência escondida pode atrasar (ou mesmo impedir) a coleta de lixo na classe externa e criar problemas de serialização. Então você só deve usar classes internas não-estáticos quando você precisar deles. É fácil esquecer de declarar a classe estática, de modo a análise de código avisa quando ela não é necessária.

O ponto de toda a classe interna é que tem acesso à classe externa. Se você não está realmente usando da classe externa, apenas torná-lo, uma classe full-blown regular.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top