良好的编程风格,两个类使用彼此的内部类
Posted
技术标签:
【中文标题】良好的编程风格,两个类使用彼此的内部类【英文标题】: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作为单独的类更好?你怎么看?谢谢。
【问题讨论】:
仅根据您提供的详细信息,我看不出这两种方式有何不同。 【参考方案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】:我可能会尝试两件事:
将内部类移到单独的类中,因为它们在逻辑上不再是内部类。
创建一些接口,让 A 和 B 至少不知道 A1 和 B1 类在哪里。
【讨论】:
【参考方案4】:我会说如果两个类都在同一个包中,请提取内部类并将它们设为私有包。这样,两个类(A 和 B)都可以引用它们,但它们对于包外的其他类仍然是不可见的。
【讨论】:
【参考方案5】:我认为您已将两个独立的设计问题合二为一。第一个问题是关于引用另一个类的内部类。第二个问题是关于A/A1和B/B1之间的循环依赖。
暴露的内部类
使用 Java 内部类的原因有很多。
-
仅与彼此和外部类相关的组类。 (又名小包装)
减少传递和引用外部类实例的样板代码
在包之外添加额外级别的范围
扩展 Java 访问范围的语义...例如,
private
对于外部类——内部类交互具有不同的含义。
减少源文件的爆炸...尤其是在(源)代码生成场景中。
访问外部类内部进行测试(内部类可以在 JAR 打包期间删除)。
在许多情况下,通过名称引用内部类是完全合理的。
循环依赖
这通常是需要提取接口或需要提取其他专用类的迹象。 如果 A1、B1 太简单而无法提取接口等,那么也许您可以以不同的方式使用内部类:拥有外部类 C,包含 A1、B1。
【讨论】:
以上是关于良好的编程风格,两个类使用彼此的内部类的主要内容,如果未能解决你的问题,请参考以下文章