Java 8 当方法的参数可以为null时,是否应该使用java可选?
如果在Java8中有这样一个方法,那么将参数包装成可选的格式是否正确?当参数可以为空时,最佳做法是什么? 值得一提的是,参数“c”来自一个我不能从那里改为可选的源Java 8 当方法的参数可以为null时,是否应该使用java可选?,java-8,optional,Java 8,Optional,如果在Java8中有这样一个方法,那么将参数包装成可选的格式是否正确?当参数可以为空时,最佳做法是什么? 值得一提的是,参数“c”来自一个我不能从那里改为可选的源 public String isSomething(c) { if(c != null) { return ("something".equals(c))? "YES" : "NO"; } return null; } 你可以写: public String isSome
public String isSomething(c) {
if(c != null) {
return ("something".equals(c))? "YES" : "NO";
}
return null;
}
你可以写:
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";
}
最佳实践是不要声明“参数可以为null”,而实际上,当参数为
null
时,该方法没有做任何有用的事情
您的代码是反模式的完美示例。如果参数为null
,则您的方法返回null
,以使调用方的代码在以后某个时间失败,在最坏的情况下,无法追溯到null
引用第一次出现的位置
如果您的方法对null
没有做任何有用的事情,那么它不应该假装这样做,而是应该实现一种快速故障行为,使调用方能够发现尽可能接近原始原因的错误:
public String isSomething(String c) {
return c.equals("something")? "YES": "NO";// yes, that ought to fail if c is null
}
如果调用者知道可选值并积极使用,则无需您提供特殊支持:
Optional<String> o = …;
o = o.map(s -> isSomething(s));
// now o encapsulates "YES", "NO", or is empty
在这里,读者完全可以清楚地看到,可以省略参数,而不必处理null
或Optional
如果要支持多个可选参数,请查看生成器模式。可能重复的
System.out.println("foo"); // prints foo and a newline
System.out.println(); // just prints a newline