具有不同数量参数的Java枚举实例
来源:爱站网时间:2021-09-11编辑:网友分享
我有没有办法让Java中的Enum接受不同数量的参数,以便在不使用varargs的情况下实现这一点。 public enum ValueType {LITERAL(){@Override ...
问题描述
我有没有办法让Java中的Enum接受不同数量的参数,以便在不使用varargs的情况下实现这一点。
public enum ValueType {
LITERAL() {
@Override
String getRepresentation(String... args) {
return MvelStringUtil.representAsLiteral(args[0]);
}
},
NUMBER() {
@Override
String getRepresentation(String... args) {
return args[0];
}
},
//converts a string representation of a date to a java.util.Date representation, because this is what is required
DATE() {
@Override
// should have two params, 1- date in string, 2- format of the passed string
String getRepresentation(String... args) {
// DateUtil.parse accepts dateInString and dateFormat.
return DateUtil.parse(args[0], args[1]).toString();
}
};
abstract String getRepresentation(String... args);
}
这里,LITERAL和NUMBER只接受一个参数,即目标值,而DATE实例接受两个。我经历了几个问题才发现使用Generics无法实现这一点,因为枚举并不能真正支持泛型。
此外,从设计的角度来看,我可能只是没有Enum中的所有类型,而是将它们放在具有一些变通方法的类中,请记住,需要从json解组此ValueType实例,并且将在unmarshalled上调用getRepresentation方法枚举实例以获取目标值的实际表示。
思路一:
这是不可能的,因为LITERAL,NUMBER和DATE符合枚举ValueType的接口。如果可能的话,这里会违反类型安全:
LITERAL()
{
@Override
String getRepresentation(String args) {
return MvelStringUtil.representAsLiteral(arg);
}
}
...
ValueType x = ValueType.LITERAL;
x.getRepresentation("a","b"); // the compiler could not know whether this is syntactically correct
思路二:
正如其他答案所说,这是不可能的。目标是确保给定类型的参数数量不会错误,这样调用代码中的错误很快就会出现,对吧?
我将在每个getRepresentation方法实现中进行简单验证。检查数组长度,如果不正确则抛出异常。
这样,有效性规则就会与主题保持一致,这是可读的。你不会在编译时知道错误,但至少你会在运行时早期就知道错误。
广告设计视角 - 我会保持枚举。大量的类型是有限的,在编译时已知,并且通过快速检查枚举,每个人都会知道有什么可能性......