Java 如何在编译时验证方法参数是否来自某个集合

Java 如何在编译时验证方法参数是否来自某个集合,java,Java,我有一个接受字符串参数(upload)的方法,该参数只能有两个值:true或false。有没有办法检查在编译时是否将正确的值传递给此方法?我尝试使用enum,但已完成运行时检查: public static enum eTrueFalse {TRUE, FALSE}; ... public Result loadSDP(String sdpFile, String name, String upload){ StringBuilder sbOptionalParameters = ne

我有一个接受字符串参数(upload)的方法,该参数只能有两个值:true或false。有没有办法检查在编译时是否将正确的值传递给此方法?我尝试使用enum,但已完成运行时检查:

public static enum eTrueFalse {TRUE, FALSE};
...

public Result loadSDP(String sdpFile, String name, String upload){
    StringBuilder sbOptionalParameters = new StringBuilder();
    if (upload != null){
        if (isTrueFalse(upload)){
            sbOptionalParameters.append(" --upload ");
            sbOptionalParameters.append(upload);
        } else {
            throw new IllegalArgumentException("The 'upload' parameter takes only 'true' or 'false' value.  Cannot handle: "
                    + upload);
        }
    }
    ...
}

private boolean isTrueFalse(String st) {
    for(eTrueFalse tf : eTrueFalse.values()){
        if(tf.name().equalsIgnoreCase(st)){
            return true;
        }
    }
    return false;
}
当然,这个问题也适用于具有两个以上预定义值的参数的方法

我希望在编译时进行检查,因为执行非常耗时。能早点检查一下就好了。欢迎指点

编辑: 上面的例子不是一个好例子,因为它可以很容易地用布尔(或布尔)来解决,而我正在寻找一个更通用的解决方案。这里有一个(希望)更好的例子。我有一个枚举:

public enum MEDIA_TYPE {XML, JSON};
还有一种方法:

public ClientResponse get(String address, String user,
        String password, MEDIA_TYPE mediaType) {
...
return webResource.queryParams(new 
        MultivaluedMapImpl()).accept(mediaType).get(ClientResponse.class);
}


上面的问题是accept方法需要字符串,所以我需要将枚举转换为字符串。最好的方法是什么?开关语句?向枚举类添加构造函数和getter?其他?

如果希望在编译时进行检查,则需要使用类型系统-特别是
boolean
用于只能为
true
false
的值


但是,如果您有代码调用此具有字符串字段的方法,则任何到
布尔值的转换只在运行时发生,因此您无法验证
布尔值.valueOf(str)
是否在编译时不会引发异常。

如果希望在编译时进行检查,然后,您需要使用类型系统,特别是
布尔值
,用于只能是
的值


但是,如果您有代码调用此具有字符串字段的方法,则任何到
布尔值的转换只会在运行时发生,因此您无法验证
布尔值。valueOf(str)
在编译时不会引发异常。

如果上载变量只取true或false,则实际上是布尔值。因此,最好使用Boolean作为参数类,这将导致参数类的编译时类型检查。

如果参数类仍然是字符串,则无法在编译时强制执行此类检查,因为字符串参数的值是在运行时计算的。

如果上载变量只接受true或false,则实际上是一个布尔值。因此,最好使用Boolean作为参数类,这将导致参数类的编译时类型检查。


当参数类仍然是字符串时,无法在编译时强制执行这样的检查,因为字符串参数的值是在运行时计算的。

在这种特殊情况下使用布尔值会起作用(允许null),但是,我正在寻找一种解决方案,以解决字符串可以具有一组预定义值的问题(不只是对或错)。似乎没有办法在编译时强制执行该检查。如果不允许null,您可以使用小写的
布尔值
,注意区别。对,明白了,谢谢。只是为了验证,没有办法在编译时强制执行某些值,如果这些值不止是真/假,这是正确的吗?@Lidia,y你也可以使用枚举。我在哪里可以找到关于在此上下文中使用枚举的引用(用于检查在编译时传递给方法的值)?在这种特定情况下使用布尔值是可行的(允许为null),但是,我正在寻找一个解决方案,以解决字符串可以有一组预定义值(不仅仅是true或false)的问题。似乎没有办法在编译时强制执行该检查。如果不允许null,您可以使用小写的
布尔值
,注意区别。对,明白了,谢谢。只是为了验证,没有办法在编译时强制执行某些值,如果这些值不止是真/假,这是正确的吗?@Lidia,y你也可以使用枚举。我在哪里可以找到关于在此上下文中使用枚举的引用(用于检查在编译时传递给方法的值)?谢谢您的回答。Matt b建议可以使用enum来完成此操作,但他没有对此进行跟进。您知道这是否正确以及如何实现吗?您可以使用enum,但参数类型应该是enum。如果您确实需要字符串类型的参数,您可以通过调用ToString来传递enum方法。这不会强制使用枚举-如果愿意,您仍然可以输入任何字符串值。参数不需要是字符串,但如果我有枚举,我需要能够从中提取字符串值。我不确定如何执行。我有
公共枚举媒体类型{XML,JSON};
。我需要调用WebResource.accept方法,它需要一个字符串。在这种情况下,从一个枚举到另一个字符串的最佳方式是什么?我是创建一个case或其他if/else语句并以这种方式将enum分配给字符串,还是为enum创建一个类并将字符串值分配给类中的enum?最好的方式是什么?添加了bet下面是上述问题描述的一个示例。向枚举添加字符串属性将是一个很好的方法。谢谢您的回答。Matt b建议可以使用枚举完成此操作,但他没有对此进行跟进。您知道这是否正确以及如何执行吗?您可以使用枚举,但参数类型应为如果确实需要字符串类型的参数,可以通过调用toString()来传递枚举方法。这并不强制使用枚举-如果愿意,您仍然可以输入任何字符串值。参数不需要是字符串,但如果我有枚举,我需要能够从中提取字符串值。我不确定如何执行。我有
公共枚举媒体类型{XML,JSON};
。我需要调用WebResource.accept方法,它需要一个字符串。是什么