Ссылка на FNC - PullRequest
       30

Ссылка на FNC

1 голос
/ 25 марта 2010

Есть ли способ в java сделать что-то вроде этого:

void fnc (void Reference_to_other_func ());

Что я пытаюсь, так это то, что у меня есть несколько мест, где мне нужно отобразить этот текст пользователю, и единственное отличие состоит в том, какой метод вызывается после этого текста. Так, например, вместо того, чтобы писать:

System.out.println("Hello");
f1();
//in some other place
System.out.println("Hello");
f2();
//etc

Я бы хотел определить одну функцию:

public void f(void Reference_to_other_func())
{
System.out.println("Hello");
Reference_to_other_func();//HERE I'M INVOKING 
}

и затем вместо повторения всего этого кода я мог бы написать что-то вроде этого:

f(f1);
//in some other place
f(f2)
//etc.

Спасибо за ответы

Ответы [ 3 ]

4 голосов
/ 25 марта 2010

Java не имеет функций первого класса, что делает большинство методов функционального программирования несколько утомительным для реализации.

В этом случае вы можете сделать интерфейс:

public interface Callback {
    void doCallback();
}

( Редактировать: или вы можете использовать java.util.concurrent.Callable<V>, что позволяет указать тип возвращаемого значения)

затем объявите f, чтобы получить экземпляр этого интерфейса:

public void f(Callback callback) {
    System.out.println("Hello");
    callback.doCallback();
}

и передать экземпляр этого интерфейса функции:

f(new Callback() {
    public void doCallback() {
        f1();
    }
});
f(new Callback() {
    public void doCallback() {
        f2();
    }
});

Как вы можете видеть, выгоды не станут очевидными, если вы не будете делать это довольно много.

2 голосов
/ 25 марта 2010

С помощью Reflection вы можете получить фактический объект Method и затем сделать.

public void f(Method m) { System.out.println("Hello"); m.invoke(this, null); }
0 голосов
/ 25 марта 2010

К сожалению (IMHO) методы (функции) не являются объектами первого класса в java, что означает, что вы не можете создавать анонимные или именованные методы, не подключив их сначала к классу.

Вы можете реализовать класс, который делает только одну вещь (например, как Callable или Runnable)

Вы можете создать анонимный класс следующим образом:

    Runnable x = new Runnable(){

        @Override
        public void run() {
            // TODO Auto-generated method stub

        }

    };   //<-- notice the semi-colon.

и вы можете определить свою функцию f следующим образом:

public void f( Runnable x ) {
   System.out.println("Hello");
   x.run();
}

}

И назовите это так.

...
// call the f-function :-)
f( new Runnable(){
@Override
public void run() {
    System.out.println("World!");
    }   
}});   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...