Метод передачи Java как параметр

Я пытаюсь использовать указатель FirAnnotations для вызова init, но это ноль, и я должен использовать FIRGeoPoint там.

for (MKPointAnnotation *point in annotationsArray) {
        FIRGeoPoint *FirAnnotations;
        FirAnnotations = [[FIRGeoPoint alloc] initWithLatitude:point.coordinate.latitude                                                longitude:point.coordinate.longitude];
        NSLog(@"annotations: %@",annotations);
}
252
задан Yojimbo 9 January 2017 в 09:40
поделиться

7 ответов

Изменить : начиная с Java 8, лямбда-выражения являются хорошим решением, поскольку другие ответы указали . Ответ ниже был написан для Java 7 и более ранних версий ...


Взгляните на шаблон команды .

// NOTE: code not tested, but I believe this is valid java...
public class CommandExample 
{
    public interface Command 
    {
        public void execute(Object data);
    }

    public class PrintCommand implements Command 
    {
        public void execute(Object data) 
        {
            System.out.println(data.toString());
        }    
    }

    public static void callCommand(Command command, Object data) 
    {
        command.execute(data);
    }

    public static void main(String... args) 
    {
        callCommand(new PrintCommand(), "hello world");
    }
}

Изменить: как Пит Киркхэм указывает , есть другой способ сделать это, используя Посетитель . Подход посетителя немного сложнее - все ваши узлы должны быть осведомлены о посетителях с помощью метода acceptVisitor () , но если вам нужно пройти по более сложному графу объектов, его стоит изучить.

222
ответ дан 23 November 2019 в 02:53
поделиться

Пример решения с отражением, переданный метод должен быть общедоступен

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Program {
    int i;

    public static void main(String[] args) {
        Program   obj = new Program();    //some object

        try {
            Method method = obj.getClass().getMethod("target");
            repeatMethod( 5, obj, method );
        } 
        catch ( NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            System.out.println( e ); 
        }
    }

    static void repeatMethod (int times, Object object, Method method)
        throws IllegalAccessException, InvocationTargetException {

        for (int i=0; i<times; i++)
            method.invoke(object);
    }
    public void target() {                 //public is necessary
        System.out.println("target(): "+ ++i);
    }
}
0
ответ дан 23 November 2019 в 02:53
поделиться

У Java есть механизм передачи названия и называть его. Это часть механизма отражения. Ваша функция должна предпринять дополнительные параметры метода класса.

public void YouMethod(..... Method methodToCall, Object objWithAllMethodsToBeCalled)
{
...
Object retobj = methodToCall.invoke(objWithAllMethodsToBeCalled, arglist);
...
}
1
ответ дан 23 November 2019 в 02:53
поделиться

В прошлый раз я проверил, Java не способен в том, что он не способен тем, что вы хотите; Вы должны использовать «рабочие вокруг», чтобы обойти такие ограничения. Насколько я вижу это, интерфейсы являются альтернативой, но не хорошей альтернативой. Возможно, кто бы сказал вам, что это значит что-то вроде этого:

public interface ComponentMethod {
  public abstract void PerfromMethod(Container c);
}

public class ChangeColor implements ComponentMethod {
  @Override
  public void PerfromMethod(Container c) {
    // do color change stuff
  }
}

public class ChangeSize implements ComponentMethod {
  @Override
  public void PerfromMethod(Container c) {
    // do color change stuff
  }
}

public void setAllComponents(Component[] myComponentArray, ComponentMethod myMethod) {
    for (Component leaf : myComponentArray) {
        if (leaf instanceof Container) { //recursive call if Container
            Container node = (Container) leaf;
            setAllComponents(node.getComponents(), myMethod);
        } //end if node
        myMethod.PerfromMethod(leaf);
    } //end looping through components
}

, который вы бы тогда ссылались с:

setAllComponents(this.getComponents(), new ChangeColor());
setAllComponents(this.getComponents(), new ChangeSize());
12
ответ дан 23 November 2019 в 02:53
поделиться

Используйте объект java.lang.reflect.Method и вызовите invoke

25
ответ дан 23 November 2019 в 02:53
поделиться

Используйте шаблон наблюдателя (иногда также называемый шаблоном слушателя):

interface ComponentDelegate {
    void doSomething(Component component);
}

public void setAllComponents(Component[] myComponentArray, ComponentDelegate delegate) {
    // ...
    delegate.doSomething(leaf);
}

setAllComponents(this.getComponents(), new ComponentDelegate() {
                                            void doSomething(Component component) {
                                                changeColor(component); // or do directly what you want
                                            }
                                       });

new ComponentDelegate () ... объявляет анонимный тип, реализующий интерфейс.

1
ответ дан 23 November 2019 в 02:53
поделиться

Сначала определите Интерфейс с методом, который вы хотите передать в качестве параметра

public interface Callable {
  public void call(int param);
}

Реализуйте класс с помощью метода

class Test implements Callable {
  public void call(int param) {
    System.out.println( param );
  }
}

// Вызвать подобным образом

Callable cmd = new Test();

Это позволяет передать cmd в качестве параметра и вызвать вызов метода, определенный в интерфейсе

public invoke( Callable callable ) {
  callable.call( 5 );
}
18
ответ дан 23 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: