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的原因。