我正在尝试创建一个简单的方法,我在下面:
public void analyzeWithAnalytics(String data) {
for (int i = 0; i < VALUE; i++) {
if (data.equals("action1")) {
// call a method on a value
}
if (data.equals("action2")) {
// call a different method on a value
}
}
这只是一个小片段(我从我的代码中花了很多钱),但实际上我希望能够调用一个特定的方法,而不需要在for循环中测试多行来调用哪个方法。
有没有办法让我通过在一开始就声明一个变量来决定要调用什么值,而不是做那么多'if statement'测试?
好的,我的班级里面有一个ArrayList:
private List<Value> values;
值对象有2个字段时间和速度。
根据我传递的字符串(时间或速度),我希望能够为该字段调用特定方法,而无需对我传递的方法进行多次字符串比较。
例如,我想能够调用getSpeed()或getTime(),而不是每次调用它时都进行字符串比较。
我只想测试一次。
答案 0 :(得分:2)
另一个:
enum Action {
SPEED {
public void doSomething() {
// code
}
},
TIME {
public void doSomething() {
// code
}
};
public abstract void doSomething();
}
public void analyzeWithAnalytics(Action data) {
for (int i = 0; i < VALUE; i++) {
data.doSomething();
}
}
答案 1 :(得分:1)
您可以使用Map
将名称(action1,action2,...)映射到常用父级和一种方法的类。并拨打以下电话:
map.getClass("action1").executeMethod();
Map<String, MethodClass> theMap = new Map<>();
interface MethodClass {
executeMethod();
}
和孩子们:
class MethodClass1 implements MethodClass{...}
class MethodClass2 implements MethodClass{...}
答案 2 :(得分:0)
你可以试试这样的东西,它肯定会减少输入的数量:
public void analyzeWithAnalytics(String data) {
for (int i = 0; i < VALUE; i++) {
switch(data) {
case "action1": doSomething(); break;
case "action2": doSomething(); break;
}
}
}
答案 3 :(得分:0)
你的目标在你的问题中并不是很明确。你想要:
如果您在演出后,请不要过早优化!意思是,不要假设这对性能很重要而不先检查出来(最好通过分析)。而是专注于可读性和懒惰。 ;)
无论如何,只需在循环外部检查data
即可避免内部的多次测试。但是你需要多次复制/粘贴循环代码。不会让方法更漂亮......
我还建议使用case
代替if
。它大大提高了可读性,并为您提供了一点性能。特别是因为您的原始代码没有使用if - elseif - ...
,这意味着即使在第一个条件成立之后也会检查所有条件。
答案 4 :(得分:0)
我能做到这一点吗?循环中不会更改data
?然后这样做:
public void analyzeWithAnalytics(String data) {
if (data.equals("action1")) {
for (int i = 0; i < VALUE; i++) {
// call a method on a value
}
} else if (data.equals("action2")) {
for (int i = 0; i < VALUE; i++) {
// call a different method on a value
}
}
}
如果您不喜欢switch
,还可以对字符串(Java 7)ìf
...