Java中的私有抽象类

Java中的私有抽象类,java,class,private,abstract,Java,Class,Private,Abstract,我是Java的新手。我最近在浏览一些Android应用程序源代码时,在一个普通类中遇到了一个私有的静态抽象类。这种嵌套类的用例是什么?如何使用它?使用这样的类有什么样的设计好处?我以前从未遇到过这种模式,但我可以想象,如果: 您希望以类似的方式在一组嵌套类中实现接口(例如,从封闭类中的公共方法返回) 这些接口实现有许多共同的代码(因此是抽象类) 除了实现之外,您不需要任何代码来了解抽象类 抽象类的子类也可能是私有的。(通常在我编写嵌套类时,它们是私有实现细节。)例如: public inte

我是Java的新手。我最近在浏览一些Android应用程序源代码时,在一个普通类中遇到了一个私有的静态抽象类。这种嵌套类的用例是什么?如何使用它?使用这样的类有什么样的设计好处?

我以前从未遇到过这种模式,但我可以想象,如果:

  • 您希望以类似的方式在一组嵌套类中实现接口(例如,从封闭类中的公共方法返回)
  • 这些接口实现有许多共同的代码(因此是抽象类)
  • 除了实现之外,您不需要任何代码来了解抽象类
抽象类的子类也可能是私有的。(通常在我编写嵌套类时,它们是私有实现细节。)例如:

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() {
        }
    }
}

我以前从未遇到过这种模式,但我可以想象,如果:

  • 您希望以类似的方式在一组嵌套类中实现接口(例如,从封闭类中的公共方法返回)
  • 这些接口实现有许多共同的代码(因此是抽象类)
  • 除了实现之外,您不需要任何代码来了解抽象类
抽象类的子类也可能是私有的。(通常在我编写嵌套类时,它们是私有实现细节。)例如:

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

如何使用它?使用这样的类有什么样的设计好处

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

这不是一个常见的用例,但我认为它在您发现它的上下文中是合理的

这种嵌套类的用例是什么

如果出现以下情况,您将使用此选项:

  • 您将要实现许多具有公共功能的嵌套类
  • 您不希望具有该功能的基类可见
您可能还会使叶类成为
final
private

如何使用它?使用这样的类有什么样的设计好处

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


这不是一个常见的用例,但我认为它在您找到它的上下文中是合理的。

一个典型的用法是替换C结构的等价物-例如,一个包含名称和值并存储在封闭类中的列表或映射中的小类。因为它不在编译单元之外使用,所以它可以是私有的

这里的静态关键字用法有点奇怪;这意味着该类与封闭类没有连接


将其抽象化是不寻常的——它表明将有具体的实现,而我从来没有这样做过。YMMV…

一个典型的用法是替换C结构的等价物-例如,一个包含名称和值并存储在封闭类的列表或映射中的小类。因为它不在编译单元之外使用,所以它可以是私有的

这里的静态关键字用法有点奇怪;这意味着该类与封闭类没有连接


将其抽象化是不寻常的——它表明将有具体的实现,而我从来没有这样做过。YMMV…

嵌套类的目的是清楚地将嵌套类与其周围的类分组,表示这两个类将一起使用

嵌套类被视为其封闭类的成员。因此,嵌套类可以声明为public、package(无访问修饰符)、protected和private(有关更多信息,请参阅访问修饰符)。 静态嵌套类

静态嵌套类声明如下:

public class Outer {

  public static class Nested {

  }

}
为了创建嵌套的实例,必须通过在其前面加上外部类名来引用它,如下所示:

public class Outer {

  public static class Nested {

  }

}
Outer.Nested实例=新建Outer.Nested()


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

嵌套类的目的是清楚地将嵌套类与其周围的类分组,表示这两个类将一起使用

嵌套类被视为其封闭类的成员。因此,嵌套类可以声明为public、package(无访问修饰符)、protected和private(有关更多信息,请参阅访问修饰符)。 静态嵌套类

静态嵌套类声明如下:

public class Outer {

  public static class Nested {

  }

}
为了创建嵌套的实例,必须通过在其前面加上外部类名来引用它,如下所示:

public class Outer {

  public static class Nested {

  }

}
Outer.Nested实例=新建Outer.Nested()

静态嵌套类本质上是嵌套在另一个类中的普通类。它与其封闭的cla相互作用