关于公共内部类的问题

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】:

如果拥有内部类(不要与静态内部类混淆)的唯一原因是降低BCD 的可见性,则可能将所有类收集在同一个包中并使用package private 可见性修饰符(即根本没有修饰符)就足够了吗?

package com.example

public class A 


class B 


class c 


class D 

现在整个项目中只有A 类可用,而BCD 仅在com.example 包中可用。请记住,使用内部类的代价是存储对父类的额外隐式 this 引用(本例中为 A)。

【讨论】:

如果类 B、C 或 D 由 getter 方法返回怎么办?会有无障碍问题吗? 有趣的问题。如果您从假设A.getB() 返回B,您仍然可以从另一个包调用此方法,但您不能拥有B 类型的变量并将结果分配给它(这在com.example 包中是可能的。 我的理解是,如果 B 有一个“公共”方法“getB1”,我可以做这个“A.getB().getB1()”,但不能做“B varB = A.getB()" 我刚刚写了一个测试程序,它证明了我上面的评论。基本上,如果类定义是非公开的,就会存在可访问性问题。【参考方案3】:

如果内部类只用于外部类并且不会在外部的任何地方使用,我认为没有问题。如果尚未完成,也许可以更改格式以使其易于阅读/维护

【讨论】:

以上是关于关于公共内部类的问题的主要内容,如果未能解决你的问题,请参考以下文章

内部类的公共与内部方法

java内部私有类的构造函数

内部类的公共构造函数是啥意思[重复]

Fragments 作为静态内部类与独立公共类的设计逻辑是啥?

Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”

关于Java问题:“内部类可作为其他类的成员,而且可访问它所在类的成员”?