如果在java 8中有这样的方法,将参数包装在Optional中是否正确?参数可以为null时的最佳实践是什么? 值得一提的是,参数“c”来自一个我无法从那里改为Optional的来源。
public String isSomething(c) {
if(c != null) {
return ("something".equals(c))? "YES" : "NO";
}
return null;
}
答案 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";
}