为什么要有FakeEnum
项目中有许多地方使用到了策略模式和枚举来实现方法分发和解耦,例如条件系统,目标系统。
项目中也有很多地方公共枚举,因为枚举会在一个公共模块中,所以会各种不同的模块使用公共枚举时修改同一个文件,对开发造成不便。
通过直接继承来达到效果
FakeEnum : 通过直接继承来实现
/**
* fakeEnum 标记接口
* 解析的时候 会直接读取该类的public static 字段
* 约定返回值 必须和当时定义的类一致
*
*/
public abstract class FakeEnum implements EnumValue {
int value;
private String name;
// skip ConfigCheck
private transient FakeEnums.Value fakeEnumValue;
/**
* id < 0 的时候 不计入byId缓存,无法通过ID获取
*
*/
protected FakeEnum(int value) {
this.value = value;
}
/**
* 获取假枚举注册时候的信息
*
*/
private FakeEnums.Value getFakeEnumValue() {
return fakeEnumValue;
}
@Override
public final int value() {
if(value <0) {
throw new UnsupportedOperationException(String.fotmat("FakeEnum:[%s] value 未初始化", getClass().getName()));
}
}
}
通过注解来达到效果
@FakeEnumReg: 通过枚举来实现
@Target({ElementType.Type})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Lazy
public @interface FakeEnumReg{
/*
* 只注册 标记类中的常量值为这个的字段
* @return 需要注册到的类型
*/
Class<? extends FakeEnum> value();
}
@SupportedAnnotationTypes("com.windfore.common.untility.fakeenum.FakeEnumReg")
public class FakeEnumProcessor extends AbstractProcessor {
public static final
}