如何在hashmap中绑定一个函数

时间:2012-01-17 07:21:04

标签: java hashmap

让我们举例说,我们将把函数绑定到一个hashmap

if(identity.equals("printf")){
    doPrintf(statement);
}else if(identity.equals("scanf")){
    doScanf(statement);
}else if(identity.equals("puts")){
    doPuts(statement);
}else if (identity.equals("functioncall")){
    expectFunc  = true;
}else if (identity.equals("functioncallwithparams")){
    expectFunc  = true;
    expectParams = true;
}else if (identity.equals("assignment")){
    //doAssignment(statement);
    vartoupdate = statement;
    updateVar = true;
}else if(identity.equals("getch"))
    doGetch();
像这样的HM.put(“getch”,doGetch())。你怎么可能这样做?

6 个答案:

答案 0 :(得分:3)

如果我正确地提出了您的问题,您希望根据其名称(或至少部分名称)调用方法。如果是这样,你应该看一下reflection API,这里有一个相关的问题,关于SO btw:How do I invoke a Java method when given the method name as a string?

答案 1 :(得分:2)

如果您可以为每个函数创建一个新对象,可以通过为每个要调用的函数创建一个Function对象并维护函数名称和它的相应函数之间的映射来实现。对象

public interface Function<T> {    
   public T apply(Object... vargs);    
}

现在让每个函数对象实现这个接口,为每个新创建的类创建新对象并将它们填充到地图中。

答案 2 :(得分:2)

interface Func { 
    public void exec();
}

class GetCharFunc implements Func { 
   @Override
   public void exec() { 
       // implementation details
   }
}

Func currentFunc;

if(identity.equals("getch")) {
    currentFunc = new GetCharFunc();
    myMap.put("getch", currentFunc); 
}

答案 3 :(得分:2)

如果所有功能都实现了相同的接口,则可以执行此操作。对你来说,情况似乎并非如此。

答案 4 :(得分:1)

Java不支持将方法或函数作为语言功能的引用。您可以使用一种方法创建接口,并使用不同的方法调用多次实现此接口,或使用Reflection将java.lang.reflect.Method对象放入哈希映射中。

答案 5 :(得分:1)

如果您使用的是Java 7,则可以使用基于switch值的String语句。这是一个简短的教程:Use String in the switch statement with Java 7

如果Java 7不是一个选项,我认为下一个最好的选择是打开一个枚举。这是关于enum types的教程。

也许如果你解释了你想要解决的问题,你会得到更好的答案。