Was stimmt nicht mit einer inneren Klasse nicht eine äußere Klasse in Java verwenden?

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

  •  16-09-2019
  •  | 
  •  

Frage

Ich bin mit einem statischen Analysator in Eclipse meinen Code zu untersuchen. Eine Klasse, foo, hat eine innere Klasse, bar. Ich erhalte die folgende Fehlermeldung:

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

Warum ist das ein Fehler? Solange die äußere Klasse, um die innere Klasse verwendet, ist das nicht ausreichend diese Informationen versteckt nützlich und richtig zu machen?

Die innere Klasse ist nicht statisch.

War es hilfreich?

Lösung

Wenn die innere Klasse kann immer nur von der äußeren Klasse verwendet werden, aber die innere Klasse braucht keinen Hinweis auf die äußere Klasse, dann können Sie es private static.

Wenn die innere Klasse zu einem anderen Person als die äußeren Klasse bekannt ist, dann könnte es auch sein, eine Top-Level-Klasse in seinem eigenen Recht.

Andere Tipps

Sieht aus wie ein Enerjy Fehler :

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

Eine verschachtelte Klasse, die keine Instanzvariablen oder Methoden von jedem seiner äußeren Klassen nicht verwendet kann statisch deklariert werden.
Dadurch verringert sich die Abhängigkeit zwischen den beiden Klassen, die Lesbarkeit und Wartung verbessert.

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

Wenn es keinen Hinweis auf die äußere Klasse zu machen, könnte es auch eine voll-auf, regelmäßige Klasse sein. Da es nicht abhängig von der äußeren Klasse ist, kann sie auf eigenen Beinen stehen. Ich vermute, das ist der Grund für den „Fehler“.

Eine nicht-statische innere Klasse hat einen impliziten Bezug auf eine Instanz seiner äußeren Klasse. Diese versteckte Referenz kann verzögern (oder sogar verhindern) Garbage Collection auf der äußeren Klasse und Serialisierung Probleme schaffen. So sollten Sie nur nicht-statische innere Klassen verwenden, wenn Sie sie benötigen. Es ist leicht zu vergessen, die Klasse statisch zu deklarieren, so dass die Codeanalyse warnt Sie, wenn es nicht benötigt wird.

Der ganze Sinn der inneren Klasse ist, dass sie den Zugang zu der äußeren Klasse. Wenn Sie nicht wirklich sind mit die äußere Klasse, machen es nur eine ganz normale, ausgewachsene Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top