Java中的私有抽象类

时间:2014-05-27 06:19:23

标签: java class private abstract

我是Java的新手。我最近在浏览一些Android应用程序源代码时遇到了常规类中的私有静态抽象类。什么可能是这种嵌套类的用例?使用这样的课程会如何使用以及有哪些设计好处?

4 个答案:

答案 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)

  

这样一个嵌套类的用例是什么?

如果出现以下情况,请使用此方法:

  • 您将实现一些具有通用功能的嵌套类,并且
  • 您不希望具有该功能的基类可见。

您可能还会将叶子类设为finalprivate

  

使用这样的课程会如何使用以及有哪些设计好处?

见上文。基本上,您正在隐藏类,以便它不能直接在最外层的封闭类之外进行子类化。我认为这也会阻止子类在最外层的封闭类之外以多态方式使用。

这不是一个常见的用例,但我认为在您找到它的情况下这是明智的。

答案 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();

静态嵌套类本质上是一个刚嵌套在另一个类中的普通类。它以相同的方式与其封闭的类交互。作为静态,静态嵌套类只能通过引用封闭类的实例来访问封闭类的实例变量。