Переменные функции в 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.
Или вы посмотрите на шаблон команды.