2009-07-15 6 views
5

J'utilise un analyseur statique dans Eclipse pour examiner mon code. Une classe, foo, a une classe interne, un bar. J'obtiens l'erreur suivante:Quel est le problème avec une classe interne n'utilisant pas une classe externe en Java?

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

Pourquoi est-ce une erreur? Tant que la classe externe utilise la classe interne n'est pas suffisante pour rendre cette information cachée utile et correcte?

La classe interne n'est pas statique.

+0

La classe interne est-elle statique? – skaffman

+0

@skaffman La classe interne n'est pas statique. – user128807

+1

vous devriez le rendre statique. – Ron

Répondre

7

Si la classe interne ne peut jamais être utilisé par la classe externe, mais la classe interne ne nécessite aucune référence à la classe externe, vous pouvez le faire private static.

Si la classe interne est connue de quelqu'un d'autre que la classe externe, alors elle pourrait tout aussi bien être une classe de premier niveau.

+0

@Christian: Si vous changez la première phrase à: "Si la classe interne ne peut être utilisée que par la classe externe ..." Je ferai de ceci la réponse acceptée. – user128807

+1

Notez le commentaire de Carlos Heuberger dans la question originale. Notez également que cette erreur a probablement été générée par l'analyseur statique Enerjy - voir la réponse de VonC. – user128807

7

S'il ne fait aucune référence à la classe externe, il peut tout aussi bien s'agir d'une classe régulière complète. Comme il ne dépend pas de la classe externe, il peut se suffire à lui-même. Je soupçonne que c'est la raison de "l'erreur".

+1

J'ai trouvé ceci quand j'ai fait un GOOG pour 'JAVA0043 qui réitère ce que Carl a dit: http://www.enerjy.com/explorer/help/rules/JAVA0043.html – seth

+0

Je comprends que cela peut dépendre de son propre, mais si je veux pratiquer une bonne information se cachant alors je devrait le garder comme une classe intérieure. Droite? – user128807

+0

Oui; parfois le garder comme une classe interne statique privée peut être une meilleure option. Mais pour la testabilité, une classe de niveau supérieur peut être préférable. –

1

Le point entier de la classe interne est qu'elle a accès à la classe externe. Si vous n'êtes pas réellement en utilisant la classe externe, faites-en une classe régulière et complète.

+3

Si vous n'utilisez pas de classe externe, faites-en une classe privée * static *. – notnoop

11

On dirait un 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; 
    } 
    } 
} 

Une classe imbriquée qui n'utilise pas toutes les variables d'instance ou des méthodes de l'une des ses classes extérieures peut être déclarée statique.
Cela réduit la dépendance entre les deux classes, ce qui améliore la lisibilité et la maintenance.

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

Oui, je crois que cette erreur a été générée par Enerjy. – user128807

5

Une classe interne non statique possède une référence implicite à une instance de sa classe externe. Cette référence masquée peut retarder (voire empêcher) la récupération de place sur la classe externe et créer des problèmes de sérialisation. Vous ne devez donc utiliser que des classes internes non statiques lorsque vous en avez besoin. Il est facile d'oublier de déclarer la classe statique, donc l'analyse de code vous avertit quand elle n'est pas nécessaire.

Questions connexes