【发布时间】:2017-08-16 03:41:20
【问题描述】:
我尝试将 Enum 风格的工厂模式实现为内部 Enum, 但它没有用。 有没有不将内部枚举分离到新文件中的解决方案? 换句话说,内部 Enum 风格的工厂模式是否可能?
代码如下。
public class SampleParent {
private class InnerChild { }
private class InnerChildA extends InnerChild { }
private class InnerChildB extends InnerChild { }
private class InnerChildC extends InnerChild { }
enum InnerChildEnum {
CHILD_A {
@Override
public InnerChild getInstance() {
return new InnerChildA(); // compile error
}
},
CHILD_B {
@Override
public InnerChild getInstance() {
return new SampleParent.InnerChildB(); // compile error
}
},
CHILD_C {
@Override
public InnerChild getInstance() {
return SampleParent.new InnerChildC(); // compile error
}
},
;
public abstract InnerChild getInstance();
}
private static class InnerChildFactoryEnumStyled {
public static InnerChild getInnerChild(InnerChildEnum child) {
return child.getInstance();
}
}
public static void main(String[] args) {
// I want to write this way
InnerChild child = InnerChildFactoryEnumStyled.getInnerChild(InnerChildEnum.CHILD_A);
}
}
编译错误信息如下
$ javac SampleParent.java
SampleParent.java:12: error: non-static variable this cannot be referenced from a static context
return new InnerChildA();
^
SampleParent.java:18: error: non-static variable this cannot be referenced from a static context
return new SampleParent.InnerChildB();
^
SampleParent.java:24: error: cannot find symbol
return SampleParent.new InnerChildC();
^
symbol: variable SampleParent
3 errors
【问题讨论】:
-
您可以简单地将 InnerChildXX 类设为静态。根据您的示例,这不是问题。
-
谢谢,正如我在下面提到的,不幸的是,实际的内部类是 AsyncTask 的子类,不能是静态的。