枚举参数的编译时验证

Six*_*One 9 java validation enums compile-time

有一个构造函数有三个enum类型的参数:

public SomeClass(EnumType1 enum1,EnumType2 enum2, EnumType3 enum3)
{...}
Run Code Online (Sandbox Code Playgroud)

枚举类型的三个参数不允许与所有可能的值组合:

例:

EnumType1.VALUE_ONE,EnumType2.VALUE_SIX,EnumType3.VALUE_TWENTY是有效组合.

但以下组合无效:

EnumType1.VALUE_TWO,EnumType2.VALUE_SIX,EnumType3.VALUE_FIFTEEN

每个EnumTypes都知道允许组合哪些值:

EnumType1和另外两个实现了一个isAllowedWith()方法来检查如下:

public enum EnumType1 {

VALUE_ONE,VALUE_TWO,...;

    public boolean isAllowedWith(final EnumType2 type) {
    switch (this) {
        case VALUE_ONE:
            return type.equals(Type.VALUE_THREE);
        case VALUE_TWO:
            return true;
        case VALUE_THREE:
            return type.equals(Type.VALUE_EIGHT);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要在编译时运行该检查,因为在我的项目中,组合在运行时始终是正确的,这是非常重要的.

我想知道是否有可能使用用户定义的注释运行该检查?

每个想法都赞赏:)

Woo*_*Moo 3

因此,最简单的方法是 1) 定义文档来解释有效组合,
2) 在构造函数中添加检查

如果构造函数抛出异常,则由调用者负责。基本上你会做这样的事情:

public MyClass(enum foo, enum bar, enum baz)  
{  
    if(!validateCombination(foo,bar,baz))
    {  
        throw new IllegalStateException("Contract violated");
    }  
} 


private boolean validateCombination(enum foo, enum bar, enum baz)  
{  
    //validation logic
} 
Run Code Online (Sandbox Code Playgroud)

现在这部分是绝对关键的。将类标记为final,有可能可以恢复部分构造的对象并滥用它来破坏您的应用程序。使用标记为 Final 的类,恶意程序无法扩展部分构造的对象并造成严重破坏。

  • 但这仍然不是编译时检查 (2认同)