JAVA:基于变量值的调用类方法

时间:2014-07-24 22:13:19

标签: java object switch-statement

我正在研究java中的一个项目,对语言和OOP来说还是一个新手。我的困境是我想根据变量的值从特定的类中执行任务/函数。

这是我想要实现的目标。

class mainClass{

    String option;

    public static void main(String[] args) {
        mainClass main = new mainClass();
    }

    mainClass(){
        secondClass sC = new secondClass();
        thirdClass tC = new thirdClass();
        switch (option){
            case "1" :
                sC.doSomething();
            case "2" :
                tC.doSomething();
        }
    }

}

class secondClass{
    void doSomething(){
        System.out.println("1");
    }


}

class thirdClass{
   void doSomething(){
       System.out.println("2");
   }

}

我不想这样做的原因是因为如果我想添加第四,第五,第六类等......我将不得不更新开关。

我尝试使用hashmap。我在其中为secondClass分配了“1”的键。但是我必须抛弃这个对象,但是这让我回到最初的头痛,不知道需要事先调用什么类。

然后我尝试使用这样的hashmap, HashMap<String, Object> map = new HashMap<String, Object>();

然后我可以做map.get(“1”),但现在我不能调用相关类的任何方法。

如果我需要使用大型开关语句,我会,但我正在积极寻求更有效的替代方案。

2 个答案:

答案 0 :(得分:1)

如果你想避免使用Reflection(这里不鼓励),你应该考虑一个简单的SAM接口:

public interface Doable { public void doSomething(); }

让所有类实现接口(这些类中不需要进行其他更改)并拥有Map<String, Doable>并调用

if (map.containsKey(option)) map.get(option).doSomething();

// Or (may be a little faster)
Doable opt = map.get(option);
if (opt != null) opt.doSomething();

如果您的实现有不同的方法,那么您很可能必须使用Reflection来获取声明的方法并按String进行比较。

答案 1 :(得分:1)

你使用Map是正确的,但你也不愿意在施法时使用。但是,现在有了泛型,你可以解决所有问题:

interface DoesSomething {
    // An object implementing this interface does something.
    public void doSomething();
}

// Class that does something.
class FirstClass implements DoesSomething {

    @Override
    public void doSomething() {
        // What FirstClass does.
    }

}

// Another class that does something.
class SecondClass implements DoesSomething {

    @Override
    public void doSomething() {
        // What SecondClass does.
    }

}


// How I know what to do. Map the string to a DoesSomethng.
Map<String, DoesSomething> whatToDo = new HashMap<>();
{
    // Populate my map.
    whatToDo.put("1", new FirstClass());
    whatToDo.put("2", new SecondClass());
}

public void doSomethingDependingOnSomething(String something) {
    // Look up the string in the map.
    DoesSomething toDo = whatToDo.get(something);
    // Was it in there?
    if (toDo != null) {
        // Yes! Make it do it's thing.
        toDo.doSomething();
    }
}