Mor*_*dan 2 java oop switch-statement
switch语句是在Java中实现运算符解释的最快方法
public boolean accept(final int op, int x, int val) {
switch (op) {
case OP_EQUAL:
return x == val;
case OP_BIGGER:
return x > val;
case OP_SMALLER:
return x < val;
default:
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在这个简单的例子中,显然是的.现在想象你有1000个运营商.它还会比类层次更快吗?当类层次结构在速度上比switch语句更有效时,是否存在阈值?(在内存中显然不是)
abstract class Op {
abstract public boolean accept(int x, int val);
}
Run Code Online (Sandbox Code Playgroud)
然后每个操作员一个班级.
编辑:对不起,我应该通过答案的外观更具体.运营商是完全未知的,我正在使用JDk 1.4.没有选择.没有枚举.没有关闭.:(用户在许多选择中选择运算符.为简单起见,想象一下具有1000个操作的GUI列表,当用户选择一个时,选择switch语句的操作码.使用类层次结构,用户将选择一个我问这个问题是因为有人必须先测试过它.我不想创建1000个类和1000个虚假操作代码来测试它.如果没有人做过.我会测试它并报告结果,如果它们可能有任何意义.
编辑:
好的,既然你必须使用JDK 1.4,我的原始答案是禁止的(左下方供参考).我猜想switch当你只看到apply(which,a,b)vs which.apply(a,b)调用时,它并不像基于抽象类的解决方案那么快.你只需要测试一下.
但是,在测试时,您可能还需要考虑启动时间,内存占用等.
原版的:
public enum OPERATION {
// ...operators+implementation, e.g.:
GREATER_THAN { public boolean apply(int a, int b) { return a > b; } };
public abstract boolean apply(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
用法:
OPERATION x = //..however you figure out which
boolean result = x.apply(a,b);
Run Code Online (Sandbox Code Playgroud)
这是针对枚举的Effective Java 中的一种用例.它的工作方式与此类似switch,只是不那么容易混淆.
由于switch语句通常在带有查找表的jvm中实现,因此很可能它会更快,具有少量或大量的运算符.这只是猜测; 要有一个明确的答案,你需要在它打算运行的系统上进行基准测试.
但是,这只是一个微观优化,你不应该关心,除非分析表明它可以真正有所作为.使用整数而不是特定的类(或枚举)会降低代码的可读性.1000个案例的巨大转换声明表明设计不好.这将对使用运算符的代码产生影响; 不太可读,更多错误,更难重构,......
并回到表演,这似乎是这里的目标.在难以阅读,设计糟糕的代码中,宏优化所需的更改变得更加困难.而这些优化通常比像这种转换这样的微优化更重要.
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |