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

时间:2014-01-05 06:49:34

标签: java

我想要一个抽象类A

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

然后我希望A有一个返回B

实例的方法

我的尝试:

public abstract class A {

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

    private class B {

    }

}

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

4 个答案:

答案 0 :(得分:5)

您可以将课程B设为private static

,从而实现您的目标
public abstract class A {
  ...

  private static class B {
    ...
  }

}

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

或许有理由将A作为abstractB作为私人内部类。我认为内容是你只想暴露接口并隐藏具体的实现类型。因为抽象类是用于子类化的,所以可以通过将B作为A的子类型来实现,并在A中声明公共接口。

public abstract class A {
  ...
  private static class B extends A {
    ...

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

A b = A.getInstanceOfB();

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

A b = A.getInstance(...);

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

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

public interface IB {...}

public abstract class A {
  ...
  private static class B implements IB {
    ...

答案 1 :(得分:1)

BInterface的实例上有一个接口(可能是B),列出了调用代码可能使用的方法。写B implements BInterface。然后为getInstanceOfB()提供BInterface的返回类型。然后可以从其他类中使用它,然后其他类可以调用BInterface中列出的方法,无论返回什么对象。

答案 2 :(得分:1)

你应该公开B,但是使用包私有构造函数:

public abstract class A {
    public static B getInstanceOfB() {
        return new B();
    }
}

public class B {
    B(){}
}

答案 3 :(得分:0)

使私有类静态删除了在eclipse中产生的错误。

public abstract class A {

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



private static class B {

}

}