关于公共内部课程的问题

时间:2011-02-17 20:28:13

标签: java oop class inner-classes

我在这个论坛中经历过关于公共内部课程的各种问题,但是我没有看到我想要找到的任何答案,所以又一个关于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个类定义)类,带有一堆内部类。虽然我同意她的理由,但我担心课程的长短。我几乎想告诉她删除内部类并使它们成为自己的类,但是现在,这样做的唯一好处是它减少了类的大小。

我个人避免使用内部课程,这可能只是一种习惯,或者我只是教条,所以我不希望我的个人偏见决定审查。这就是为什么,我想知道你们,我提出的其他优点或缺点是什么? (即将他们移到自己的班级)谢谢。

3 个答案:

答案 0 :(得分:2)

我所知道的唯一区别是内部类可以访问外部类的私有实例变量。私有内部类的使用也阻止了对其他类的访问。

来自oracle java tutorial:

  

类的逻辑分组 - 如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的。嵌套这样的“辅助类”使得它们的包更加简化。

     

增加封装 - 考虑两个顶级类A和B,其中B需要访问A的成员,否则这些成员将被声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,并且B可以访问它们。此外,B本身可以隐藏在外面。

     

更易读,可维护的代码 - 在顶级类中嵌套小类会使代码更接近于使用它的位置。

答案 1 :(得分:1)

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

package com.example

public class A {
}

class B {
}

class c {
}

class D {
}

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

答案 2 :(得分:0)

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