Переменные функции в Java

Можно ли с помощью какого-либо метода назначить функцию переменной в Java, как в PHP или JavaScript?

... Или эта область работает по-другому, когда дело доходит до Java?

5 ответов

Решение

В Java у вас есть Method а также MethodHandles который может вызывать метод через отражение, но это пока не поддерживается в языке.

В Java 8 вы сможете использовать ссылки на методы.

В сегодняшней java нет, ты не можешь.

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

Типичным примером является реализация интерфейса Comparator:

Comparator<ProductSearchResult> c = new Comparator<ProductSearchResult>() {
    public int compare(ProductSearchResult result1, ProductSearchResult result2) {
        return result1.product.getRsId().compareTo(result2.product.getRsId());
    }
};
Collections.sort(groupResults, c); // I pass a function, wrapped in my Comparator implementation

Ближайшие у вас есть внутренние классы в сочетании с интерфейсами. Они могут нести не только одну, но и многие функции (методы), которые могут быть делегированы обратно в методы мастер-класса, если это желательно. Но это решение может легко оказаться слишком тяжелым:

class Main {

   interface X { 
     void doX();
   }

   class Ref1 implements X {
     void doX() { doA(); };
   }

   class Ref2 implements X {
     void doX() { doB(); };
   }

   void doA() {  };
   void doB() {  };

   void demo() {
      X x = new Ref1();
      x.doX();
   }
}

Это имитирует что-то похожее на Lambdas ... (вам понадобится немного больше приведения, если вы используете что-то кроме Strings, но я приведу пример вкратце) ...

public class MyTest {

    public static void main(String[] args) {

        Lambda l = new Lambda() { public Object func(Object x) 
                                    { return "Hello " + x; } 
                                };

        System.out.println(l.func("Bob"));

        System.out.println(nowTryFromMethod(l));

        System.out.println((new Lambda() { public Object func(Object x) 
                                             { return "Goodbye " + x; }
                                         }).func("Harry"));
    }

    private static Object nowTryFromMethod(Lambda l) {
            return l.func("Jerry");
    }
}

class Lambda {

    public Object func(Object x) { return null; }
}

Выход:

Hello Bob
Hello Jerry
Goodbye Harry

Java НЕ поддерживает это.

Тем не менее, вы можете сделать это в JVM-Languages ​​очень удобно, например, в Groovy.

Или вы посмотрите на шаблон команды.

Другие вопросы по тегам