关于公共内部类的问题
Posted
技术标签:
【中文标题】关于公共内部类的问题【英文标题】:Question about Public Inner Classes 【发布时间】:2011-02-17 20:28:12 【问题描述】:我已经在这个论坛上回答了关于公共内部类的各种问题,但是我没有看到任何我想要找到的答案,所以又是一个关于 Java 公共内部类的问题。我正在审查另一个开发人员的代码,这个人使用了很多内部类。这是一个例子
public class A
private class B
private class C
private class D
:
:
public class B
public class c
public class D
所以当我问开发人员她为什么使用内部类时,她告诉我,因为这些类只会被这个类使用,所以她这样做了,我同意这是一个正当的理由,
然而,这个类已经变成了一个“长”类(大约 200 行 getter 和 setter,包括 4-5 个类定义),其中包含一堆内部类。虽然我同意她的理由,但我担心课程的长度。我几乎想告诉她删除内部类并让它们成为自己的类,但现在,这样做的唯一好处是它减少了类的大小。
我个人避免使用内部类,这可能只是一种习惯,或者我只是教条主义,所以我不希望我的个人偏见决定评论。这就是为什么,我想从你们那里知道,我提出的建议还有哪些优点或缺点? (即将他们转移到自己的班级)谢谢。
【问题讨论】:
这些内部类是公开的(如问题标题和问题本身所述)还是私有的(如代码示例中所述)? 是的,代码和我在代码示例中的一样。之所以将这些内部类称为 public,是因为类定义本身是 public 外部类是公共的,但它隐藏了私有内部类。 是的,我明白这一点,但是内部的“公共”类定义呢,它们会被设为“公共”,以便外部类可以通过 getter 访问这些类吗? 我运行了一个测试程序,它证明了我的上述断言。 【参考方案1】:我知道的唯一区别是内部类可以访问外部类的私有实例变量。使用私有内部类也会阻止其他类的访问。
来自oracle java tutorial:
类的逻辑分组——如果一个类只对另一个类有用,那么将它嵌入到该类中并将两者放在一起是合乎逻辑的。嵌套这样的“帮助类”使它们的包更加精简。
增强封装——考虑两个***类 A 和 B,其中 B 需要访问 A 的成员,否则这些成员将被声明为私有。通过将类 B 隐藏在类 A 中,可以将 A 的成员声明为私有的,并且 B 可以访问它们。此外,B 本身可以对外界隐藏。
更具可读性、可维护性的代码——在***类中嵌套小类可以使代码更接近使用它的位置。
【讨论】:
【参考方案2】:如果拥有内部类(不要与静态内部类混淆)的唯一原因是降低B
、C
和D
的可见性,则可能将所有类收集在同一个包中并使用package private 可见性修饰符(即根本没有修饰符)就足够了吗?
package com.example
public class A
class B
class c
class D
现在整个项目中只有A
类可用,而B
、C
和D
仅在com.example
包中可用。请记住,使用内部类的代价是存储对父类的额外隐式 this
引用(本例中为 A
)。
【讨论】:
如果类 B、C 或 D 由 getter 方法返回怎么办?会有无障碍问题吗? 有趣的问题。如果您从假设A.getB()
返回B
,您仍然可以从另一个包调用此方法,但您不能拥有B
类型的变量并将结果分配给它(这在com.example
包中是可能的。
我的理解是,如果 B 有一个“公共”方法“getB1”,我可以做这个“A.getB().getB1()”,但不能做“B varB = A.getB()"
我刚刚写了一个测试程序,它证明了我上面的评论。基本上,如果类定义是非公开的,就会存在可访问性问题。【参考方案3】:
如果内部类只用于外部类并且不会在外部的任何地方使用,我认为没有问题。如果尚未完成,也许可以更改格式以使其易于阅读/维护
【讨论】:
以上是关于关于公共内部类的问题的主要内容,如果未能解决你的问题,请参考以下文章
Fragments 作为静态内部类与独立公共类的设计逻辑是啥?