Java中有没有一种方法可以让编译器处理互斥选项?
我想知道是否有一种方法可以声明一个接受字符串和枚举的方法,但只要求在使用某个枚举时使用该字符串 例如:Java中有没有一种方法可以让编译器处理互斥选项?,java,class,methods,types,Java,Class,Methods,Types,我想知道是否有一种方法可以声明一个接受字符串和枚举的方法,但只要求在使用某个枚举时使用该字符串 例如: public enum SearchType { REGEX,DEFAULT } public static List<File> Search(String path, SearchType search, String pattern) { //do things } 公共枚举搜索类型{ 正则表达式,默认值 } 公共静态列表搜索(字符串路径、搜索类型搜索、字符
public enum SearchType {
REGEX,DEFAULT
}
public static List<File> Search(String path, SearchType search, String pattern) {
//do things
}
公共枚举搜索类型{
正则表达式,默认值
}
公共静态列表搜索(字符串路径、搜索类型搜索、字符串模式){
//做事
}
理想情况下,程序员只需要指定他们是否使用了特定的SearchType.REGEX
,并且如果您忘记了它,或者将它包含在SearchType.DEAFULT
中,您的程序将无法编译
目前,如果程序员使用的是SearchType DEFAULT
,则必须传入一个空字符串,并且代码必须使用两个if
语句检查互斥选项。现在,如果在正则表达式中包含默认模式或忘记模式,我会抛出一个IllegalArgumentException,因为这两种情况都表明使用此函数的人可能犯了错误
我的问题是:
- 这种编译时参数检查在Java8中是否可行
- 有没有更惯用/安全/合乎逻辑的方法来处理这种情况
谢谢 您应该声明两个方法:调用一个方法来执行一项作业,而不是两项作业。因此,您可以在这里声明:
公共静态列表搜索(字符串路径);
及
公共静态列表搜索(字符串路径、字符串模式);
在这种情况下,您的enum
SearchType
是无用的。记住向方法中添加javadoc,用户不会感到困惑。在Java8中没有方法进行编译时参数检查
但是,您可以使用更简洁的方式编写此文件。大概是这样的:
public static List<File> Search(String path, SearchType search, String... searchArgs) {
if (search == SearchType.REGEX) {
if (searchArgs.length != 1) {
throw new IllegalArgumentException("Improper number of arguments for regex search: Expected 1, got " + searchArgs.length);
}
//Do the search
}
if (search == SearchType.DEFAULT) {
if (searchArgs.length != 0) {
throw new IllegalArgumentException("Improper number of arguments for default search: Expected 0, got " + searchArgs.length);
}
//Do the search
}
}
Search("C:\\", SearchType.REGEX, "[a]");
Search("C:\\", SearchType.DEFAULT);
但是,如果您以错误的方式调用它,您仍然不会收到编译错误 我完全忘了你可以这么做(我对java isms还是有点陌生),所以谢谢,但我在实际的程序中实际使用了五种不同的搜索类型,这就是导致整个enum的原因。