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,因为这两种情况都表明使用此函数的人可能犯了错误。
我的问题是:
这种编译时参数检查甚至可以用 Java 8 实现吗?
有没有更多的idiomatic/safe/logical方法来处理这种情况?
这听起来像是可以由某种接口处理,如果可以的话。
谢谢!
您应该声明两个方法:调用一个方法来完成一项工作,而不是两个。所以在这里,你可以声明:
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);
不过,如果您以错误的方式调用它,您仍然不会收到编译错误。
我想知道是否有一种方法可以声明一个接受字符串和枚举的方法,但仅在使用特定枚举时才需要使用字符串。
示例:
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,因为这两种情况都表明使用此函数的人可能犯了错误。
我的问题是:
这种编译时参数检查甚至可以用 Java 8 实现吗?
有没有更多的idiomatic/safe/logical方法来处理这种情况?
这听起来像是可以由某种接口处理,如果可以的话。
谢谢!
您应该声明两个方法:调用一个方法来完成一项工作,而不是两个。所以在这里,你可以声明:
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);
不过,如果您以错误的方式调用它,您仍然不会收到编译错误。