【问题标题】: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 访问这些类吗?
  • 我运行了一个测试程序,它证明了我的上述断言。

标签: java oop class inner-classes


【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2022-01-19
      • 2011-07-27
      • 2023-03-11
      相关资源
      最近更新 更多