具有不同数量参数的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方法实现中进行简单验证。检查数组长度,如果不正确则抛出异常。

这样,有效性规则就会与主题保持一致,这是可读的。你不会在编译时知道错误,但至少你会在运行时早期就知道错误。

广告设计视角 - 我会保持枚举。大量的类型是有限的,在编译时已知,并且通过快速检查枚举,每个人都会知道有什么可能性......

上一篇:来自枚举的Java查找枚举

下一篇:退出应用程序后出现“BindException:Address in in use”

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载