Java 在GWT-RPC中使用嵌套枚举
我有一个带有嵌套枚举的枚举(我想将其设置为私有),但当我这样做时,GWT告诉我嵌套枚举不可见,并引发异常Java 在GWT-RPC中使用嵌套枚举,java,gwt,enums,gwt-rpc,Java,Gwt,Enums,Gwt Rpc,我有一个带有嵌套枚举的枚举(我想将其设置为私有),但当我这样做时,GWT告诉我嵌套枚举不可见,并引发异常 public enum OuterEnum { A(NestedEnum.X), B(NestedEnum.Y), C(NestedEnum.X); NestedEnum nestedValue; private OuterEnum(NestedEnum nv) { nestedValue = nv; } private enum Nest
public enum OuterEnum {
A(NestedEnum.X),
B(NestedEnum.Y),
C(NestedEnum.X);
NestedEnum nestedValue;
private OuterEnum(NestedEnum nv) { nestedValue = nv; }
private enum NestedEnum {
X, Y;
}
}
如果我从嵌套枚举中删除private修饰符,那么代码就可以工作。为什么GWT不允许嵌套枚举使用私有修饰符?有解决办法吗?这可能与JavaScript有关。在转换为JavaScript的过程中,嵌套类可能被编写为非嵌套类。因此,如果它是私有的,其他任何东西都无法访问它。解决方法是不要将其设置为私有,默认作用域应该可以正常工作。要成为RPC参数类类型,它必须有一个空构造函数用于序列化。 所以我想,如果你加上
private OuterEnum(){
// may be you should give a default value to nestedValue
}
它会成功的 序列化工作得很好,至少在您提供的示例中是这样。所有枚举都以以下方式进行序列化/反序列化(GWT 2.4、2.3、2.2): 这个例子与前一个非常不同。假设在GWT-RPC服务中使用了OuterClass。由于NestedEnum用作OuterClass的字段,GWT需要为其创建一个TypeSerializer。但是由于TypeSerializer是一个单独的类,所以它没有任何对NestedEnum的访问权(因为它是私有的)。所以编译失败了
这基本上是您的示例不起作用的唯一情况。在某些特定的GWT版本中可能会有一些bug,但我100%确信您的示例在GWT 2.2-2.4中有效。您是否尝试过将其设置为静态?这真是太酷了!JLS(第8.9节)明确指出“嵌套的枚举类型是隐式静态的。允许显式地将嵌套的枚举类型声明为静态的。”这不适用于嵌套在
enum
s中的enum
s,还是GWT编译器中的一个小缺陷?……而GWT编译器只是使用Eclipse编译器(ECJ)解析源代码并构建AST。因此,要么Eclipse编译器在不将枚举暴露为静态方面存在缺陷,要么GWT在不推断嵌套枚举的静态标志方面存在缺陷(我会选择ECJ,但这实际上取决于它们的意图;这可能是设计上的)……我觉得很愚蠢。。。。以前的版本中有一些东西挂在那里,结果是使它保持静态并没有什么区别。。。。回到绘图板上。对不起,伙计们!您使用的是什么GWT版本?在GWT2.4.0中,您的示例可以正常工作。这是一个很好的观点,我没有想到这一点。理想情况下,我希望它是私有的…问题是内部枚举的可见性。它可以很好地序列化外部枚举。这不能回答我的问题。
public static OuterEnum instantiate(SerializationStreamReader streamReader) throws SerializationException {
int ordinal = streamReader.readInt();
OuterEnum[] values = OuterEnum.values();
assert (ordinal >= 0 && ordinal < values.length);
return values[ordinal];
}
public static void serialize(SerializationStreamWriter streamWriter, OuterEnum instance) throws SerializationException {
assert (instance != null);
streamWriter.writeInt(instance.ordinal());
}
public class OuterClass implements Serializable{
private OuterEnum.NestedEnum nested;
private OuterEnum outer;
public enum OuterEnum {
A(NestedEnum.X), B(NestedEnum.Y), C(NestedEnum.X);
NestedEnum nestedValue;
private OuterEnum(NestedEnum nv) {
nestedValue = nv;
}
private enum NestedEnum {
X, Y;
}
}
}