我有一组字符串,我将用作键和特定字符串,我希望调用一个函数。那么是否可以为该对中的值分配一个函数?地图:在Java地图中,我可以将一个函数分配给<K,V>对中的值吗?
exampleMap.get("SOME_STRING"); // should call a function abc();
我有一组字符串,我将用作键和特定字符串,我希望调用一个函数。那么是否可以为该对中的值分配一个函数?地图:在Java地图中,我可以将一个函数分配给<K,V>对中的值吗?
exampleMap.get("SOME_STRING"); // should call a function abc();
封装的功能的Java接口:
public interface Task {
void doSomething();
}
,然后pouplate地图与此接口的实例:
map.put("someString", new Task() {
@Override
public void doSomething() {
System.out.println("foo");
}
});
map.put("someOtherString", new Task() {
@Override
public void doSomething() {
System.out.println("bar");
}
});
然后调用函数(任务)与给定的字符串相关s
:
map.get(s).doSomething();
不,java不支持任何方法对象。你可以使用反射或尝试用枚举常量替换你的字符串,并调用它们的方法。
见What's the nearest substitute for a function pointer in Java?
有一对夫妇的这个页面,你可以尝试不同的答案。
Java不直接支持它,但可以间接使用接口来做。
public interface Funct {
public void apply();
}
,然后当你要使用它的值,这样做..
Map<String, Funct> aMap = new HashMap<String, Funct>();
aMap.put("foo", new Funct() { public void apply() { System.out.println("bar"); } });
如果你想这是透明的地图的用户,你必须实现自己的地图。
是的。虽然,它是一个“函数”的java版本:一个匿名类。
用一个例子清楚示出:
interface MyFunction {
public int calculate(int a, int b);
}
Map<String, MyFunction> map = new HashMap<String, MyFunction>();
map.put("add", mew MyFunction() {
public int calculate(int a, int b) {
return a + b;
});
map.put("multiply", mew MyFunction() {
public int calculate(int a, int b) {
return a * b;
});
您可以通过使用反射做到这一点。考虑下面的代码。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class Temp3 {
public static void main(String[] args) {
Map<String, Method> map = new HashMap<String, Method>();
Temp3 obj = new Temp3();
Method method = null;
try {
method = obj.getClass().getMethod("someMethod");
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
map.put("someMethod", method);
try {
(map.get("someMethod")).invoke(obj);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
public void someMethod() {
System.out.println("**************************************");
}
}
如果你想要的行为,你应该定义:
Map<String, Method> map = new HashMap<String, Method>();
SomeClass obj = new Someclass();
Method method = null;
try {
method = obj.getClass().getMethod("someMethod", param1.class, param2.class, ...);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
map.put("someMethod", method);
try {
(map.get("someMethod")).invoke(obj, arg1, arg2, ...);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
的方法,里面SomeClass
public class SomeClass {
// Other class contents
public void someMethod() {
// Target method contents
}
}
使用上述逻辑的样本代码调用自己的班级。
类应该实现,至少,如下界面:
interface ApplicativeMap<K,V>{
void put(K key, Function<V> producer);
V get(K key);
其中Function<V>
应该是一个接口暴露的V apply()
方法。
你的实现应该与此类似:
类ApplicativeMapImplementation实现ApplicativeMap { 私人地图>功能;
public void put(K key, Function<V> producer){
functions.put(key, producer);
}
public V get(K key){
if(functions.containsKey(key)){
return functions.get(key).apply();
} else{
throw new NoSuchElementException();
}
}
这是可能的唯一方法是实现自己的地图。 java中标准的框外Map实现不允许任何类似的东西。 – Santosh
[如何调用存储在HashMap中的方法? (Java)](http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java) – NINCOMPOOP
不,是的,但不是你想要的。你必须使用反射,然后大约你应该问你的设计发生了什么 – MadProgrammer