代码样式Java:从私有方法冒泡返回值

时间:2017-06-23 21:21:50

标签: java

我经常遇到这样的情况:我想在私有方法中进行一些计算,并在私有方法不为空时冒泡返回私有方法。我觉得应该有比这更好的方式:

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"
}

实现这一目标的最佳做法是什么?

2 个答案:

答案 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));