简化java中的方法

时间:2014-02-19 22:27:33

标签: java

我正在尝试创建一个简单的方法,我在下面:

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(),而不是每次调用它时都进行字符串比较。

我只想测试一次。

5 个答案:

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

你的目标在你的问题中并不是很明确。你想要:

  1. 避免输入很多案例?
  2. 获取代码可读性?
  3. 提高绩效?
  4. 如果您在演出后,请不要过早优化!意思是,不要假设这对性能很重要而不先检查出来(最好通过分析)。而是专注于可读性和懒惰。 ;)

    无论如何,只需在循环外部检查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 ...