【问题标题】:good programming style, two classes using each other's inner classes良好的编程风格,两个类使用彼此的内部类
【发布时间】:2011-05-20 13:29:18
【问题描述】:

我有 A 类,其内部类定义为 A1,B 类的内部类定义为 B1。你认为它的实现中的A类引用B1,B类引用A1可以吗?这不是一种糟糕的编程风格吗?它只是 A1 是非常 A 特定的类,而 B1 是非常 B 特定的,这就是我耦合它们的原因。可以这样留下它还是将A1和B1作为单独的类更好?你怎么看?谢谢。

【问题讨论】:

  • 仅根据您提供的详细信息,我看不出这两种方式有何不同。

标签: java coding-style inner-classes


【解决方案1】:

我相信如果你需要在你的一个类中引用另一个类的内部类,那是因为可能拥有内部类的类应该提供一些方法来避免这个问题。

如果问题不是这样,那么内部类可能足够通用,可以在其他两个类中使用,因此应该是一个独立类,它可能应该是指定其上下文的同一个包的一部分应用/使用。

【讨论】:

  • @Luis 但是使用内部类的基本前提是任何其他类都不需要它,那么为什么这是一个好习惯呢?如果错了,请纠正我。
  • 我就是这么说的。内部类只能由其父类使用。在这种情况下使用它是一种很好的做法,因为它可以更好地封装和组织您的代码以及您所代表的概念。如果您需要在其他地方使用该代码,那么它并不意味着是一个内部类。
【解决方案2】:

你可以 - 虽然我认为内部类的重点是因为它们应该在外部类中使用。换句话说,我不是公共内部类的忠实粉丝。

我实际上只是将 A1 和 B1 作为其自己的类 - 在我看来 A1 和 B1 毕竟不是特定于 A 和 B 因为 A1 被 B 使用而 B1 被 A 使用。

看这篇帖子Why/when should you use nested classes“当你嵌套的类只对封闭类有用时使用嵌套类”

【讨论】:

  • 是的,但是您所指的帖子是针对 .NET...类。例如,如果没有对实例的显式引用,C# 嵌套类就无法访问外部类的非静态方法。所以我认为这个链接不能直接翻译。
  • 是的,但它仍然提供了适用于 OO 概念的一般概念视图
  • 在下面查看我的答案...IMO 嵌套类主要用于利用/利用语言细节。
【解决方案3】:

我可能会尝试两件事:

  1. 将内部类移到单独的类中,因为它们在逻辑上不再是内部类。

  2. 创建一些接口,让 A 和 B 至少不知道 A1 和 B1 类在哪里。

【讨论】:

    【解决方案4】:

    我会说如果两个类都在同一个包中,请提取内部类并将它们设为私有包。这样,两个类(A 和 B)都可以引用它们,但它们对于包外的其他类仍然是不可见的。

    【讨论】:

      【解决方案5】:

      我认为您已将两个独立的设计问题合二为一。第一个问题是关于引用另一个类的内部类。第二个问题是关于A/A1和B/B1之间的循环依赖。

      暴露的内部类

      使用 Java 内部类的原因有很多。

      1. 仅与彼此和外部类相关的组类。 (又名小包装)
      2. 减少传递和引用外部类实例的样板代码
      3. 在包之外添加额外级别的范围
      4. 扩展 Java 访问范围的语义...例如,private 对于外部类——内部类交互具有不同的含义。
      5. 减少源文件的爆炸...尤其是在(源)代码生成场景中。
      6. 访问外部类内部进行测试(内部类可以在 JAR 打包期间删除)。

      在许多情况下,通过名称引用内部类是完全合理的。

      循环依赖

      这通常是需要提取接口或需要提取其他专用类的迹象。 如果 A1、B1 太简单而无法提取接口等,那么也许您可以以不同的方式使用内部类:拥有外部类 C,包含 A1、B1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 2011-02-11
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2010-09-12
        • 2016-07-17
        • 2010-10-20
        相关资源
        最近更新 更多