我在这个论坛中经历过关于公共内部课程的各种问题,但是我没有看到我想要找到的任何答案,所以又一个关于Java Public Inner Classes的问题。我正在审查另一个开发人员的代码,这个人已经使用了很多内部类。这是一个例子
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个类定义)类,带有一堆内部类。虽然我同意她的理由,但我担心课程的长短。我几乎想告诉她删除内部类并使它们成为自己的类,但是现在,这样做的唯一好处是它减少了类的大小。
我个人避免使用内部课程,这可能只是一种习惯,或者我只是教条,所以我不希望我的个人偏见决定审查。这就是为什么,我想知道你们,我提出的其他优点或缺点是什么? (即将他们移到自己的班级)谢谢。
答案 0 :(得分:2)
我所知道的唯一区别是内部类可以访问外部类的私有实例变量。私有内部类的使用也阻止了对其他类的访问。
类的逻辑分组 - 如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的。嵌套这样的“辅助类”使得它们的包更加简化。
增加封装 - 考虑两个顶级类A和B,其中B需要访问A的成员,否则这些成员将被声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,并且B可以访问它们。此外,B本身可以隐藏在外面。
更易读,可维护的代码 - 在顶级类中嵌套小类会使代码更接近于使用它的位置。
答案 1 :(得分:1)
如果拥有内部类(不要与静态内部类混淆)的唯一原因是降低B
,C
和D
的可见性,可能会收集所有类在相同的包中并使用包私有可见性修饰符(即根本没有修饰符)就足够了?
package com.example
public class A {
}
class B {
}
class c {
}
class D {
}
现在整个项目中只有课程A
可用,而B
,C
和D
仅在com.example
包中可用。请记住,使用内部类需要存储额外的隐式this
对父类的引用(在此示例中为A
)。
答案 2 :(得分:0)
如果内部类只用于外部类并且不会在外面的任何地方使用,我认为没有问题。也许格式化可以更改,以便在未完成时易于阅读/维护