Java中是否有一种方法可以让编译器处理互斥选项?

时间:2015-04-26 16:08:48

标签: java class methods types

我想知道是否有办法声明一个接受String和Enum的方法,但是如果使用某个枚举则只需要使用该字符串。

示例:

$Root.data("tfo")

理想情况,只有程序员指定他们是否使用特定的public enum SearchType { REGEX,DEFAULT } public static List<File> Search(String path, SearchType search, String pattern) { //do things } ,如果您忘记了它,或将其包含在{{ 1}},你的程序不会编译。

按照目前的情况,程序员必须传入一个空字符串,如果他们使用SearchType.REGEX,并且代码必须使用几个SearchType.DEAFULT语句进行检查以实现互斥选项。现在,如果你在DEEXULT中包含一个模式或忘记REGEX上的模式,我会抛出一个IllegalArgumentException,因为这两个事情都表明使用这个函数的人可能犯了错误。

我的问题是:

  • 是否可以使用Java 8进行这种编译时参数检查?

  • 有没有更惯用/安全/合理的方式来处理这种情况?

这听起来好像甚至可以通过某种接口来处理。

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

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

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