我是Java的新手。我最近在浏览一些Android应用程序源代码时遇到了常规类中的私有静态抽象类。什么可能是这种嵌套类的用例?使用这样的课程会如何使用以及有哪些设计好处?
答案 0 :(得分:9)
我从来没有遇到过这种模式,但我可以想象:如果符合以下条件,它会很有用:
抽象类的子类也可以是私有的。 (通常,当我编写嵌套类时,它们是私有实现细节。)例如:
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() {
}
}
}
答案 1 :(得分:2)
这样一个嵌套类的用例是什么?
如果出现以下情况,请使用此方法:
您可能还会将叶子类设为final
或private
。
使用这样的课程会如何使用以及有哪些设计好处?
见上文。基本上,您正在隐藏类,以便它不能直接在最外层的封闭类之外进行子类化。我认为这也会阻止子类在最外层的封闭类之外以多态方式使用。
这不是一个常见的用例,但我认为在您找到它的情况下这是明智的。
答案 2 :(得分:0)
一个典型的用法是替换C结构的等价物 - 例如包含名称和值的小类,并存储在封闭类的List或Map中。因为它不在编译单元之外使用,所以它可以是私有的。
这里的静态关键字用法有点奇怪;这意味着该类与封闭类没有任何联系。
使它抽象是不寻常的 - 它表明将有具体的实现,我从来没有这样做过。 YMMV ...
答案 3 :(得分:0)
嵌套类的目的是将嵌套类与其周围的类清楚地分组,表明这两个类将一起使用。
嵌套类被视为其封闭类的成员。因此,嵌套类可以声明为public,package(无访问修饰符),protected和private(有关详细信息,请参阅访问修饰符)。 静态嵌套类
静态嵌套类的声明如下:
public class Outer {
public static class Nested {
}
}
为了创建嵌套的实例,你必须通过在前面添加Outer类名来引用它,如下所示:
Outer.Nested instance = new Outer.Nested();
静态嵌套类本质上是一个刚嵌套在另一个类中的普通类。它以相同的方式与其封闭的类交互。作为静态,静态嵌套类只能通过引用封闭类的实例来访问封闭类的实例变量。