当方法的参数可以为null时,是否应该使用java可选?

时间:2018-03-22 14:50:57

标签: java-8 optional

如果在java 8中有这样的方法,将参数包装在Optional中是否正确?参数可以为null时的最佳实践是什么? 值得一提的是,参数“c”来自一个我无法从那里改为Optional的来源。

public String isSomething(c) {  
    if(c != null) {
        return ("something".equals(c))? "YES" : "NO";
    }

    return null;        
}

2 个答案:

答案 0 :(得分:4)

最佳做法是不要声明“参数可以为null”,而实际上,当参数为null时,该方法不起作用。

您的代码是反模式的完美示例。如果参数为null,则您的方法返回null,让调用者的代码稍后失败,在最坏的情况下,在无法追溯到{{1}的位置引用第一次出现。

如果您的方法对null没有任何帮助,它不应假装这样做,而是实现 fail-fast 行为,允许调用者发现错误为尽可能接近原因:

null

如果来电者了解public String isSomething(String c) { return c.equals("something")? "YES": "NO";// yes, that ought to fail if c is null } 值并积极使用它,则无需您身边的特别支持:

Optional

Optional<String> o = …; o = o.map(s -> isSomething(s)); // now o encapsulates "YES", "NO", or is empty 已经注意不要评估函数是否为空,因此,您的方法不需要接受可选项。

如果你有一个可以真正做一些有用的操作,如果一个参数不存在,你应该首先考虑已建立的方法重载模式:

Optional.map

在这里,读者完全可以明白,在不必处理System.out.println("foo"); // prints foo and a newline System.out.println(); // just prints a newline null的情况下,可以省略参数。

如果您有多个可选参数支持,请查看Builder模式。

答案 1 :(得分:0)

你可以写:

public String isSomething(String c) {
    return Optional.ofNullable(c)
            .map(x -> "something".equals(x) ? "YES" : "NO")
            .orElse(null);
}

但是你所拥有的(略有修改)可能更具可读性:

public String isSomething(String c) {
    if (c == null) {
        return c;
    }

    return "something".equals(c) ? "YES" : "NO";

}