【发布时间】:2023-03-16 02:02:01
【问题描述】:
我是 Java 的新手。我最近在浏览一些 Android 应用程序源代码时遇到了一个常规类中的私有静态抽象类。这种嵌套类的用例是什么?它将如何使用以及使用这样的类有哪些设计好处?
【问题讨论】:
标签: java class private abstract
我是 Java 的新手。我最近在浏览一些 Android 应用程序源代码时遇到了一个常规类中的私有静态抽象类。这种嵌套类的用例是什么?它将如何使用以及使用这样的类有哪些设计好处?
【问题讨论】:
标签: java class private abstract
我之前从未遇到过这种模式,但我可以想象它在以下情况下很有用:
抽象类的子类也可能是私有的。 (通常当我编写嵌套类时,它们是私有的实现细节。)例如:
public interface Foo {
// Methods here
}
public class FooFactory {
public static Foo getFoo1() {
return new Foo1();
}
public static Foo getFoo2() {
return new Foo2();
}
private static abstract class AbstractFoo implements Foo {
// Implement methods in Foo in terms of
// doSomething()...
// Implementation-specific method
public abstract void doSomething();
}
private static class Foo1 extends AbstractFoo {
public void doSomething() {
}
}
private static class Foo2 extends AbstractFoo {
public void doSomething() {
}
}
}
【讨论】:
这种嵌套类的用例是什么?
如果出现以下情况,您会使用它:
您可能还会创建叶类final 或private。
它将如何使用以及使用这样的类有哪些设计好处?
见上文。基本上,您隐藏了该类,以便它不能直接在最外面的封闭类之外进行子类化。我认为这也将防止子类在最外层的封闭类之外被多态地使用。
这不是一个常见的用例,但我想在您找到它的上下文中它是明智的。
【讨论】:
一个典型的用途是替换 C 结构的等价物 - 例如一个包含名称和值并存储在封闭类的 List 或 Map 中的小类。因为它不在编译单元之外使用,所以它可以是私有的。
这里的静态关键字用法有点奇怪;这意味着该类与封闭类没有任何联系。
将其抽象化是不寻常的——它表明会有具体的实现,而我从未这样做过。 YMMV...
【讨论】:
嵌套类的目的是将嵌套类与其周围的类清楚地分组,表明这两个类要一起使用。
嵌套类被视为其封闭类的成员。因此,可以将嵌套类声明为 public、package(无访问修饰符)、protected 和 private(有关更多信息,请参阅访问修饰符)。 静态嵌套类
静态嵌套类声明如下:
public class Outer {
public static class Nested {
}
}
为了创建 Nested 的实例,您必须通过在其前面加上 Outer 类名称来引用它,如下所示:
Outer.Nested instance = new Outer.Nested();
静态嵌套类本质上是一个普通类,它刚刚嵌套在另一个类中。它以相同的方式与其封闭类交互。作为静态的,静态嵌套类只能通过对封闭类实例的引用来访问封闭类的实例变量。
【讨论】: