Какой самый практичный способ иметь функции в словаре в Java?

При программировании на C/C++ или Python у меня иногда был словарь со ссылками на функции по заданным ключам. Тем не менее, я действительно не знаю, как иметь такое же или, по крайней мере, похожее поведение в Java, позволяющее мне динамически ассоциировать ключ-функцию (или метод на сленге Java).

Кроме того, я нашел метод HashMap, который кто-то предложил, но действительно ли это лучший и самый элегантный способ? Я имею в виду, что создание нового класса для каждого метода, который я хочу использовать, кажется слишком сложным.

Я был бы очень признателен за каждый вклад в это.


person Marc Müller    schedule 17.07.2009    source источник
comment
Чем HashMap отличается от словаря?   -  person Draemon    schedule 17.07.2009


Ответы (2)


Вам не нужно создавать полный класс имени для каждого действия. Вы можете использовать анонимные внутренние классы:

public interface Action<T>
{
    void execute(T item);
}

private static Map<String, Action<Foo>> getActions()
{
    Action<Foo> firstAction = new Action<Foo>() {
        @Override public void execute(Foo item) {
             // Insert implementation here
        }
    };
    Action<Foo> secondAction = new Action<Foo>() {
        @Override public void execute(Foo item) {
             // Insert implementation here
        }
    };
    Action<Foo> thirdAction = new Action<Foo>() {
        @Override public void execute(Foo item) {
             // Insert implementation here
        }
    };
    Map<String, Action<Foo>> actions = new HashMap<String, Action<Foo>>();
    actions.put("first", firstAction);
    actions.put("second", secondAction);
    actions.put("third", thirdAction);
    return actions;
}

(Затем сохраните его в статической переменной.)

Итак, это не так удобно, как лямбда-выражение, но не слишком плохо.

person Jon Skeet    schedule 17.07.2009
comment
Execute должен выполняться, как рекомендуют соглашения об именах Java. - person dfa; 17.07.2009
comment
@dfa: Ура - вот что я получаю за смешивание имени делегата .NET с интерфейсом Java :) - person Jon Skeet; 17.07.2009

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

person Draemon    schedule 17.07.2009
comment
Apache Commons Functor существует для обеспечения этого в Java — commons.apache.org/sandbox/functor . Вставьте это в свой HashMap :) - person Jon; 17.07.2009