如果我有一个类和一个辅助类来执行它的一些功能,那么将它作为内部类是否有意义。
public class Foo {
private FooHelper helper;
// constructor & any other logic
public void doSomeThing() {
helper.do();
}
}
public class FooHelper {
public void do() {
// code
}
}
在上述情况下,将FooHelper
作为内部类是否有意义?道歉,如果这听起来很愚蠢,但我对用例感到困惑。
答案 0 :(得分:54)
是的,让它成为内在阶层是完全合理的。如果没有其他类需要它,请将其设为私有。如果它不需要对外部类成员的独占访问,那么使它成为一个静态嵌套类,因为它将需要更少的内存空间。
的建议如果需要访问权限,请使用非静态嵌套类(或内部类) 到封闭实例的非公共字段和方法。使用静态 如果您不需要此访问权限,则为嵌套类。
答案 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)
何时使用内部类?
答案 10 :(得分:0)
根据Oracle文档,简单解释
使用嵌套类的令人信服的原因包括:
这是一种将仅在一个地方使用的类进行逻辑分组的方法:如果一个类仅对另一个类有用,那么将其嵌入该类并保持两个在一起。嵌套此类“帮助程序类”可使它们的程序包更加简化。
它增加了封装:考虑两个顶级类A和B,其中B需要访问A的成员,否则它们将被声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,而B可以访问它们。另外,B本身可以对外界隐藏。
这可能会导致代码更具可读性和可维护性:在顶级类中嵌套小类会使代码更靠近使用位置。