我经常遇到这样的情况:我想在私有方法中进行一些计算,并在私有方法不为空时冒泡返回私有方法。我觉得应该有比这更好的方式:
public String myMethod(int value) {
String tmp = strategy1(value);
if (tmp != null) {
return tmp;
}
tmp = strategy2(value)
if (tmp != null) {
return tmp;
}
return "default result"
}
private String strategy1(int value) {
return value > 1? "Good value" : null;
}
我想写的是这样的(不用java代码)
public String myMethod(int value) {
return if(strategy1(value) != null);
return if(strategy2(value) != null);
return "default result"
}
实现这一目标的最佳做法是什么?
答案 0 :(得分:1)
如果你需要检查传递给方法的value
,你需要抛出异常而不是返回null
值,返回null
是一种不好的做法。在 Effective Java 中阅读它。考虑一下,你的代码应该是这样的:
public String myMethod(int value) {
if (value < 1) {
throw new IllegalArgumentException();
}
}
如果你尝试验证某些东西,你最好返回布尔值而不是处理null,并在代码之外检查它是否有效。
public boolean isValid(int value) {
return (value > 1);
}
更好的方法是创建界面Value
interface Value<T> {
boolean isValid();
T getValue() throws IllegalStateException;
}
包含特定值并在值良好时返回true
,在错误时返回false
,当您尝试获取错误的值时会抛出异常;
答案 1 :(得分:0)
如果您的策略是“策略”界面的实现,那么您可以使用这样的实用方法:
public interface Strategy {
String evaluate(int);
}
public String firstResult(int candidate, String defaultValue, Strategy... strategies) {
for (Strategy strategy : strategies) {
String result=strategy.evaluate(candidate);
if (result!=null) return result;
}
return defaultValue;
}
使用接口可以支持短路 - 在第一个策略返回非空结果后,不会处理任何其他策略。
Java 8用法:
System.out.println(firstResult(12, "snot-nosed kid",
age -> age >= 18 ? "adult" : null,
age -> age > 12 ? "teen" : null,
age -> age < 5 ? "pre-school" : null
));
Java 7用法:
Strategy strategy1=new Strategy() {
public String evaluate(int candidate) {
return candidate >=18 ? "adult" : null;
}
};
Strategy strategy2=new Strategy() {
public String evaluate(int candidate) {
return candidate >12 ? "teen" : null;
}
};
Strategy strategy3=new Strategy() {
public String evaluate(int candidate) {
return candidate < 5 ? "pre-school" : null;
}
};
System.out.println(firstResult(12, "snot-nosed kid", strategy1, strategy2, strategy3));