何时在Java中使用辅助类的内部类

Hil*_*ild 55 java inner-classes

如果我有一个类和一个辅助类来执行它的一些功能,那么将它作为内部类是否有意义.

    public class Foo {
       private FooHelper helper;

       // constructor & any other logic

       public void doSomeThing() {
         helper.do();
       }
    }

    public class FooHelper {
        public void do() {
         // code
        }
    }
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,将内容FooHelper作为一个内部类是否有意义?道歉,如果这听起来很愚蠢,但我对用例感到困惑.

MD *_*med 62

是的,让它成为内在阶层是完全合理的.如果没有其他类需要它,请将其设为私有.如果它不需要对外部类成员的独占访问,则将其设置为静态嵌套类,因为这样会占用更少的内存空间.

查看官方教程中的建议-

如果需要访问封闭实例的非公共字段和方法,请使用非静态嵌套类(或内部类).如果不需要此访问权限,请使用静态嵌套类.

  • @Hild:`静态嵌套类`无法访问封闭类的成员(除非它是静态的).如果这符合您的要求,请将其设为静态.另一方面,非静态内部类可以完全访问封闭类的成员. (4认同)

san*_*hat 14

如果你认为FooHelper不会在所有有用的其他类比Foo,话很有道理,使其作为private 内部类Foo.这种设计的一个例子可以HashMap在它定义私有内部类的地方找到KeySet

否则将它作为private实例看起来很好.


Cha*_*ngh 13

来自JAVA SE Docs

为什么使用嵌套类?

它是一种逻辑分组仅在一个地方使用的类的方法:如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的.嵌套这样的"帮助类"使得它们的包更加简化.

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

是的,使用FooHelper作为内部类是有意义的.


Ash*_*ani 6

以下是内部类的一些用法.

  • 内部类用于获取可以比方法更好地获取对象的功能.
  • 它们可以在需要一组多个操作并且类内部可重用性很好的情况下使用,并且不会访问它们,而是外部类之外的方法.
  • 内部类也是为了实现多重继承.
  • 内部类在类上下文中有用时使用.
  • 它们用于分隔类内的逻辑.

因此,如果您有一些匹配上述点的要求,则可以使用内部类.最好使内部类private阻止来自其他类的访问.在您的情况下,使用内部类有助于使代码可读并在外部类中分离逻辑.