【问题标题】:Is there a way in Java to have mutually exclusive options handled by the compiler?Java中有没有办法让编译器处理互斥选项?
【发布时间】:2015-07-04 23:32:24
【问题描述】:

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

例子:

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 中实现吗?

  • 是否有更惯用/安全/合乎逻辑的方式来处理这种情况?

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

谢谢!

【问题讨论】:

    标签: java class methods types


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我完全忘记了你可以做到这一点(我对 java-isms 还是有点陌生​​),所以谢谢,但实际上我在实际程序中有五种不同的搜索类型,即首先是什么导致了整个枚举。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 2020-05-29
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多