我有以下方法:
private static final int OPEN_FOR_RAISE_RANGE = 35;
private static final int OPEN_FOR_CALL_RANGE = 25;
public void foo(double num){
if(num <= OPEN_FOR_RAISE_RANGE){
//do something
}
else if(num <= (OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE)){
//do something else
}
//etc
}
基本上检查数字落入的范围并采取适当的行动。我想知道除了很多if之外是否有更好/更有效的方法来做到这一点?
由于
答案 0 :(得分:3)
从commons-lang查看NumberRange。
NumberRange range = new NumberRange(
OPEN_FOR_RAISE_RANGE,
OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE
);
if(range.containsNumber(num)) {
// do this
} else {
// do something else
}
答案 1 :(得分:1)
这跟我想的一样好。
请注意,编译器会在编译时将OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE
计算替换为值60
,因此您不会在每次调用时计算此值。
答案 2 :(得分:1)
我觉得很好,如果if语句是这样嵌套的话会更麻烦:
if (...) {
if (...) ...;
else (...) { ... }
if (...)
if (...)
if (...) ...;
else (...) ...;
}
然后你真的应该考虑将代码分解为他们自己的方法。
答案 3 :(得分:0)
如果你有大量的if / ifelse / ifelse /.../ else语句,这样的话会有所帮助:
public interface Choice {
public boolean check(int value);
public void action(int value);
}
public class BelowRange implements Choice {
public static boolean check(int value) {
return (value < 10);
}
public void action(int value) {
// Do something;
}
}
public class Range1 implements Choice {
public boolean check(int value) {
return (value > 10 && value < 50);
}
public void action(int value) {
// Do something;
}
}
...
在您的代码中:
List<Choice> choices = new ArrayList<Choice>();
choices.add(new BelowRange());
choices.add(new Range1());
...
for (Choice choice : choices) {
if (choice.check(value)) {
choice.action(value);
}
}
我可能会实现它,所以选择的实现可能是静态方法,而不是必须实例化它们,但事情的要点就在那里。
如果编译器对此进行了大量优化,特别是使用静态方法,它应该不会更慢,并且从开发人员的角度来看,它会使嵌套的if / else结构更易于维护。