Java 中有没有办法让编译器处理互斥选项?

Is there a way in Java to have mutually exclusive options handled by the compiler?

我想知道是否有一种方法可以声明一个接受字符串和枚举的方法,但仅在使用特定枚举时才需要使用字符串。

示例:

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 语句来检查互斥选项。现在,如果您使用 DEFAULT 包含模式或忘记 REGEX 上的模式,我会抛出 IllegalArgumentException,因为这两种情况都表明使用此函数的人可能犯了错误。

我的问题是:

这听起来像是可以由某种接口处理,如果可以的话。

谢谢!

您应该声明两个方法:调用一个方法来完成一项工作,而不是两个。所以在这里,你可以声明:

public static List<File> search(String path);

public static List<File> search(String path, String pattern);

你的枚举 SearchType 在那种情况下是无用的。请记住将 javadoc 添加到您的方法中,这样用户就不会感到困惑。

Java 8.

中无法进行编译时参数检查

但是,您可以使用 varargs 以更简洁的方式编写此代码。像这样:

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);

不过,如果您以错误的方式调用它,您仍然不会收到编译错误。