Здравствуйте, Dima-Amid, Вы писали:
DA>каким образом в Java можно передавать функции в качестве параметра для функции?
интерфейсы (с точки зрения той функции, которая принимает параметр-функцию) и их анонимные реализации, вызывающие требуемую функцию (с точки зрения вызывающего кода, который знает, какую функцию надо подсунуть, и имплементирующий соотв. вызов)
Здравствуйте, Dima-Amid, Вы писали:
DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?
Только через интерфейс
Пример:
inteface MyFuncPtr
{
int f(int a);
}
class F1 implements MyFuncPtr
{
int f(int a)
{
return a+1;
}
}
class F2 impements MyFuncPtr
{
int f(int a)
{
return a-1;
}
}
class Main
{
public static void func(MyFuncPtr f,int arg)
{
System.out.println(f.f(arg));
}
public static void main(String[] args)
{
func(new F1(),1);
func(new F2(),1);
}
}
Здравствуйте, C0s, Вы писали:
C0s>Здравствуйте, Dima-Amid, Вы писали:
DA>>каким образом в Java можно передавать функции в качестве параметра для функции?
C0s>интерфейсы (с точки зрения той функции, которая принимает параметр-функцию) и их анонимные реализации, вызывающие требуемую функцию (с точки зрения вызывающего кода, который знает, какую функцию надо подсунуть, и имплементирующий соотв. вызов)
Ой про анонимные и не поумал через анонимные даже лучше
Здравствуйте, Dima-Amid, Вы писали:
DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?
Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)
public class BBB {
public static void main(String[] args) throws Exception {
Class clazz = Test.class;
Method method = clazz.getMethod("first");
new Test().second(method);
}
}
class Test {
public void first() {
System.out.println("Hello from First.first()");
}
public void second(Method method) throws Exception {
method.invoke(this);
}
}
Здравствуйте, bolshik, Вы писали:
B>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)
Кроме всего прочего он ещё не устойчивый к изменениям, в отличие от варианта с интерфейсами.
Здравствуйте, bolshik, Вы писали:
B>>Кроме всего прочего он ещё не устойчивый к изменениям, в отличие от варианта с интерфейсами.
B>Под неустойчивым к изменениям ты имеешь ввиду отсутствие статической проверки?
Здравствуйте, bolshik, Вы писали:
B>Здравствуйте, Dima-Amid, Вы писали:
DA>>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?
B>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)
Здравствуйте, Дмитрий В, Вы писали:
B>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов) ДВ>В два раза медленнее.
Здравствуйте, Dima-Amid, Вы писали:
DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?
Оффтоп — существует также несколько языков, которые позволяют использовать ФВП(функции высшего порядка) и могут использоваться на JVM. Например, JRuby (реализация спецификации языка Руби на JVM), Jython (то же самое о Python), Groovy (придуман специально для JVM, динамика с опциональной статической типизацией).. Это все динамические языки, соответственно страдает перфоманс, нельзя проверить в компайл тайм функцию на предмет соответствия сигнатуры. Есть ещё Scala — все проверки во время компиляции (конечно, как и в Java можно внести элемент динамики, используя cast-ы и рефлексию), проверка сигнатуры, конструирование анонимных функций (ака лямбд) итд.
Конечно, если стоит требование использования именно языка (а не рантайма) Java, то нужно пользовать интерфейсы + анонимные реализации.
Здравствуйте, Дмитрий В, Вы писали:
ДВ>Здравствуйте, bolshik, Вы писали:
B>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)
ДВ>В два раза медленнее.
The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, Дмитрий В, Вы писали:
ДВ>>Здравствуйте, bolshik, Вы писали:
B>>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)
ДВ>>В два раза медленнее.
A> ты хотел сказать на два порядка? A>http://www-128.ibm.com/developerworks/library/j-dyn0603/
A>
A>The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.
На адрес статьи посмотри — 03 Jun 2003
Я сцылку на первоисточник не помню, но точно помню читал, что рефлекшн оптимизировали, и разница во времени вызова составляет два раза.
А напиши тест и проверь, раз такой любознательный
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Дмитрий В, Вы писали:
B>>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов) ДВ>>В два раза медленнее.
B> Не в 3, не в 10. А именно в 2?
Соглачен, удивительное совпадение, 2! — у тебя столько рук и ног, и ушей столько же, клевая цифра
A>>The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.
ДВ>На адрес статьи посмотри — 03 Jun 2003
это не важно, за оптимизацию чего-то в оптимизированном компиляторе в 500 раз я бы нобеля сразу давал (шутка) ДВ>Я сцылку на первоисточник не помню, но точно помню читал, что рефлекшн оптимизировали, и разница во времени вызова составляет два раза. ДВ>А напиши тест и проверь, раз такой любознательный
Писал недавно, когда исследовал мультиметоды под жавой.... домой приду, выложу
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Дмитрий В, Вы писали:
ДВ>>Соглачен, удивительное совпадение, 2! — у тебя столько рук и ног, и ушей столько же, клевая цифра
B>Ты вот такой остроумный. А по делу сказать ничего не можешь.