我想知道是否有办法声明一个接受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进行这种编译时参数检查?
有没有更惯用/安全/合理的方式来处理这种情况?
这听起来好像甚至可以通过某种接口来处理。
谢谢!
答案 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);
但是,如果以错误的方式调用它,仍然不会收到编译错误。