2013-05-03 2 views
0

Я видел некоторые API, принимающие метод в качестве параметра. Но не знаю, как они на самом деле работают. Может быть, некоторые размышления внутри, но не знаю, как это сделать.Принятие метода в качестве входного параметра для другого метода

Скажите, пожалуйста, как мне написать метод, который может принять метод в качестве входного сигнала? Например;

someMethod(on(SomeClass.class).someMethod()); 

Альтернатива:

someMethod("fieldName" , SomeClass.class); 

Но это не тип Safe. И создание enum будет дополнительным бременем.

+0

Вы уверены, что это метод, а не название поля? Потому что это похоже на имя поля. –

+0

Вы имеете в виду что-то вроде этого 'someMethod (obj.getFoo())'? –

+0

yup, это метод геттера для поля. Извините за опечатку. У меня обновить вопрос –

ответ

1

В Java, как правило, это делается с помощью класса, который реализует Runnable или Callable

Так вместо передачи в функции, вы передаете объект, который имеет функцию, которая может быть вызвана.

+0

да и нет. runnable - это класс с конкретной целью.я предпочитаю использовать более общий [вызываемый] (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Callable.html). в тех случаях, когда вам нужны параметры, вам придется написать свой собственный интерфейс. – kritzikratzi

+1

@kritzikratzi спасибо, я только когда-либо использовал java для нескольких курсов в школе, мне повезло запомнить столько, сколько я делаю;) –

2

В Java вы обычно пишете интерфейс, как это:

public interface Function{ 
    public void apply(); 
} 

Затем вы можете использовать вашу функцию как это:

static void main(String args[]){ 
    callSomeMethod(new Function(){ 
     public void apply(){ 
      System.out.println("hurray"); 
     } 
    }); 
} 

static void callSomeMethod(Function f){ 
    f.apply(); 
} 

В Java 8 это будет значительно упрощена с добавлением лямбды. Но пока это так, как это делается в java.

Встроенные классы

Java имеет несколько встроенных в классах, которые являются родовыми. Например, посмотрите на вызываемом: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

Отражения

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

class Thing{ 
    public void whatever(){ 
     System.out.println("hi!"); 
    } 
} 

public static void main(String args[]){ 
    Thing thing = new Thing(); 
    callSomeMethod(thing, "whatever"); 
} 

public static void callSomeMethod(Object obj, String methodName){ 
    obj.getClass().getMethod(methodName).invoke(obj); 
} 

Однако отражение довольно медленно по сравнению с описанным выше способом, и вы также теряете статическую безопасность типов. В целом я предлагаю не делать этого таким образом, если не абсолютно необходимо.

0

Общий способ сделать это доступен для вызова, но большинство методов прохождения в java обычно выполняются путем создания интерфейса. Внутри интерфейса вы определяете несколько методов, которые отражают то, что вы хотите сделать, затем вы передаете классы, которые реализуют интерфейс как аргументы метода.

Смежные вопросы