繁体   English   中英

具有不同数量参数的Java枚举实例

[英]Java enum instances with different number of arguments

我有没有办法让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实例和getRepresentation方法将在unmarshalled上调用枚举实例以获取目标值的实际表示。

这是不可能的,因为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方法实现中进行简单验证 检查数组长度, 如果不正确则抛出异常

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM