как связать функцию в hashmap - PullRequest
2 голосов
/ 17 января 2012

Допустим, например, что мы собираемся связать функцию в хэш-карту

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 ]

3 голосов
/ 17 января 2012

Если я правильно понял ваш вопрос, вы хотите вызвать метод на основе его имени (или хотя бы его части).Если это так, вы должны взглянуть на API отражения , здесь есть вопрос, связанный с SO btw: Как вызвать метод Java, когда имя метода дано в виде строки?

2 голосов
/ 17 января 2012

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

2 голосов
/ 17 января 2012
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 голосов
/ 17 января 2012

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

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

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

1 голос
/ 17 января 2012

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

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

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

1 голос
/ 17 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...