【问题标题】:What is wrong with an inner class not using an outer class in Java?内部类在 Java 中不使用外部类有什么问题?
【发布时间】:2009-07-15 17:58:28
【问题描述】:

我在 Eclipse 中使用静态分析器来检查我的代码。一个类 foo 有一个内部类 bar。我收到以下错误:

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

为什么这是一个错误?只要外部类使用内部类,还不足以使这些信息隐藏有用且正确吗?

内部类不是静态的。

【问题讨论】:

标签: java static-analysis


【解决方案1】:

看起来像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;
    }
  }
}

【讨论】:

    【解决方案2】:

    如果内部类只能被外部类使用,而内部类不需要引用外部类,那么您可以将其设为private static

    如果外部类以外的其他人知道内部类,那么它本身也可能是一个顶级类。

    【讨论】:

    • @Christian:如果您将第一个短语更改为:“如果内部类只能由外部类使用......”我会将此作为接受的答案。
    • 请注意 Carlos Heuberger 在原始问题中的评论。另请注意,此错误可能是由 Enerjy 静态分析器生成的——请参阅 VonC 的答案。
    【解决方案3】:

    如果它没有对外部类进行任何引用,它也可能是一个完整的常规类。由于它不依赖于外部类,它可以独立存在。我怀疑这就是“错误”的原因。

    【讨论】:

    • 我在为 'JAVA0043 做 GOOG 时发现了这一点,它重申了 Carl 所说的:enerjy.com/explorer/help/rules/JAVA0043.html
    • 我知道它可以依赖于它自己,但是如果我想练习良好的信息隐藏,那么我应该将它作为一个内部类。对吗?
    • 是的;有时将其保留为私有静态内部类可能是更好的选择。但为了可测试性,顶级类可能更可取。
    【解决方案4】:

    非静态内部类有一个对其外部类实例的隐式引用。这种隐藏的引用会延迟(甚至阻止)外部类的垃圾收集并产生序列化问题。所以你应该只在需要时使用非静态内部类。很容易忘记将类声明为静态,因此代码分析会在不需要时向您发出警告。

    【讨论】:

      【解决方案5】:

      内部类的全部意义在于它可以访问外部类。如果您实际上没有使用外部类,只需将其设为常规的、成熟的类即可。

      【讨论】:

      • 如果您不使用外部类,请将其设为私有 static 类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2022-01-25
      • 2010-10-20
      • 2020-11-22
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多