2012-01-17 3 views
2

Допустим, к примеру, мы собираемся связать функции в 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 («Геч», doGetch()). Как вы могли это сделать?

+2

Вы хотите вызвать функцию, имя которой основано на ключе? – Paul

+0

e чехол для ключей nalang ni uyyyyyyyyyyyy hahaha –

+0

http://stackoverflow.com/questions/2882948/calling-a-method-named-string-at-runtime-in-java-and-c Это то, что вы хотите сделать? –

ответ

3

Если у вас есть вопрос правильно, вы хотите вызвать метод, основанный на его имени (или, по крайней мере, его части). Если да, то вы должны смотреть на reflection API, есть связанный с этим вопрос здесь SO кстати: How do I invoke a Java method when given the method name as a string?

+0

yeap точно savinos –

2

Если вы можете принять удар для создания нового объекта для каждой функции, это просто может быть достигнуто путем создания Function объекта для каждая функция должна быть вызвана и поддерживается сопоставление между именем функции и соответствующим функциональным объектом.

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

Теперь просто сделайте каждый объект функции реализующим этот интерфейс, создайте новые объекты для каждого вновь созданного класса и наполните их на карте.

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); 
} 
2

Вы могли бы это сделать, если бы все функции реализовали один и тот же интерфейс. Кажется, это не так.

1

Java не поддерживает ссылки на методы или функции как язык. Вы можете создать интерфейс с помощью одного метода и реализовать его несколько раз с помощью различных вызовов метода или использовать Reflection и поместить объекты java.lang.reflect.Method в свою хэш-карту.

1

Если вы используете Java 7, вы можете использовать оператор switch на основе значения String. Вот краткое руководство по этому вопросу: Use String in the switch statement with Java 7

Если Java 7 не является вариантом, я думаю, что следующий лучший вариант - включить перечисление. Вот учебник по enum types.

Возможно, если вы объясните, в чем проблема, которую вы пытаетесь решить, вы получите лучшие ответы.

Смежные вопросы