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

时间:2013-08-23 06:16:09

标签: 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
        }
    }

在上述情况下,将FooHelper作为内部类是否有意义?道歉,如果这听起来很愚蠢,但我对用例感到困惑。

11 个答案:

答案 0 :(得分:54)

是的,让它成为内在阶层是完全合理的。如果没有其他类需要它,请将其设为私有。如果它不需要对外部类成员的独占访问,那么使它成为一个静态嵌套类,因为它将需要更少的内存空间。

查看the official tutorial -

的建议
  

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

答案 1 :(得分:13)

如果您认为FooHelper 根本不会对Foo以外的其他类有用,那么将其设为private Foo的内部类。这种设计的一个例子可以在HashMap中找到,它定义了私有内部类KeySet

否则将其作为private实例看起来不错。

答案 2 :(得分:11)

来自JAVA SE Docs

为什么要使用嵌套类?

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

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

是的,将 FooHelper 用作内部类是有意义的。

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:1)

当内部类很小并且不需要名字时,它们才有意义。 GUI中的监听器是经典的例子。

如果班级很重要,则应将其命名并放在单独的文件中。

普通GUI示例中的监听器类做了一件很小的事情,通常只是派遣到其他一些函数来做实际工作。

我还经常使用静态嵌套类(技术上不是内部类)用于仅在另一个类的上下文中使用的类 - Map.Entry就是一个很好的例子。它只与Map一起使用,因此将Entry的定义作为Map接口的一部分会使组织有意义。

我通常没有太多用于其他类型的嵌套类,如非静态成员类和本地类。但他们偶尔会有用。有关合法使用成员类的一个很好的示例,请参阅LinkedList.ListItr的源代码。这是一个私有内部类,其目的是为ListIterator提供LinkedList的实现。为此,访问LinkedList中的私有数据非常有用。要仅使用顶级类来实现此目的,必须在LinkedList中公开更多公共方法,以允许ListIterator获取LinkedList的底层实现。相反,使用内部类允许LinkedList将其实现保持为私有,因为它应该是。

答案 5 :(得分:1)

是的,使用内部类的优点是它可以访问外部类的成员。在你的情况下,如果你认为你的FooHelper不被任何其他类使用,你可以使它成为内部类

要查看内部类的实用程序,请查看AWT的示例。匿名内部类广泛用于事件处理程序。

答案 6 :(得分:0)

Foo的范围是什么?当Foo domain model class具有自己的生命周期且helper是常见服务时,似乎混合了两个具有不同范围/生命周期的对象。

通常,域实体拥有自己的生命周期,从创建,持久性到GC。另一方面,帮助者或服务是静态的或更好的动态,其生命周期等于整个应用程序,例如:春豆。

一旦您的域名实体包含服务的引用,它就会给您带来严重的问题。例如。每次调用存储库Get都需要将此服务的引用注入域实体。我建议避免这种模式。

对我来说,为你做出Helper的实例并不明显。

答案 7 :(得分:0)

Hild,是的,在很多情况下使用内部类是有意义的。

以这种方式思考 - 内部类将与外部类一起生存和死亡,因此外部类特别需要的任何功能都可以添加到内部类中。 流行的例子是 - 大多数情况下的监听器 - KeyListeners的类型,MouseListeners,eventListeners。

Java中的类允许您具有特定功能,但有时您可能需要具有单独的专用功能,但它也需要与您正在设计的类密切相关。

内部类可以有四种类型。一个简单的谷歌搜索可以帮助您找到更多相关信息。

答案 8 :(得分:0)

嵌套类,使您能够对仅在一个地方使用的类进行逻辑分组,增加封装的使用,并创建更易读和可维护的代码。本地课程,匿名课程。

http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

答案 9 :(得分:0)

  

何时使用内部类?

  1. 内部类不需要任何额外或单独的文件。
  2. 内部类比较小并且与“父”类或“外部”类紧密耦合。 避免使用很多辅助类并且适合解释OOD的遏制原则。
  3. 同一文件中的所有代码都提高了可读性并提高了性能(如在线代码)。它们的重要性在于编码,并被视为一种良好的做法。
  4. 当您想要定义回调时,匿名内部类非常有用 在飞行中。
  5. 内部类的对象可以访问对象的实现 它创造了它 - 包括私人数据。
  6. 内部类能够访问其父类的行为,包括private。

答案 10 :(得分:0)

根据Oracle文档,简单解释

使用嵌套类的令人信服的原因包括:

这是一种将仅在一个地方使用的类进行逻辑分组的方法:如果一个类仅对另一个类有用,那么将其嵌入该类并保持两个在一起。嵌套此类“帮助程序类”可使它们的程序包更加简化。

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

这可能会导致代码更具可读性和可维护性:在顶级类中嵌套小类会使代码更靠近使用位置。