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)
我需要在编译时运行该检查,因为在我的项目中,组合在运行时始终是正确的,这是非常重要的.
我想知道是否有可能使用用户定义的注释运行该检查?
每个想法都赞赏:)
因此,最简单的方法是 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 的类,恶意程序无法扩展部分构造的对象并造成严重破坏。
| 归档时间: |
|
| 查看次数: |
1045 次 |
| 最近记录: |