抽象类返回私有嵌套类的实例

Vol*_*ort 3 java

我想要一个抽象类A.

然后我想要一个B只能被实例化的类A.没有其他人可以访问B- 只A.

然后我想要A一个返回实例的方法B.

我的尝试:

public abstract class A {

    public static B getInstanceOfB() {
        return new B();
    }

    private class B {

    }

}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.我怎样才能做到这一点?

nta*_*lbs 5

你可以做你想做的通过使类B为private static:

public abstract class A {
  ...

  private static class B {
    ...
  }

}
Run Code Online (Sandbox Code Playgroud)

如果该类B不是static,则应该有一个A要访问的实例B.如果要在B不实例化的情况下实例化A,则应该创建内部类static.

也许有,你做的原因A是abstract和B私有内部类.我认为内容是你只想暴露接口并隐藏具体的实现类型.因为抽象类是用于子类化的,所以这可以通过将B子类型作为子类型A并声明公共接口来实现A.

public abstract class A {
  ...
  private static class B extends A {
    ...
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建B范围之外的实例A,只要您指定对象的类型A,如下所示:

A b = A.getInstanceOfB();
Run Code Online (Sandbox Code Playgroud)

最好从方法名称中删除特定类型的符号,并通过传递参数来指定它.

A b = A.getInstance(...);
Run Code Online (Sandbox Code Playgroud)

您可以在getInstance()工厂方法中创建所需类型的对象作为指定参数.

好吧,如果A不应该像这样使用,你可以为类声明一个公共接口,B并将其用作B范围之外的类型A.

public interface IB {...}
Run Code Online (Sandbox Code Playgroud)

和

public abstract class A {
  ...
  private static class B implements IB {
    ...
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的,因为B从外面看不到.你如何在A类之外的其他地方使用结果对象? (2认同)
  • @DavidWallace前两位支持者可能同意答案,其余的则跟随这一趋势. (2认同)