2017-01-12 8 views
0

Это может быть действительно глупый вопрос или даже невозможно.Как передать методы в качестве параметров в Android

Я не уверен, что это будет вызвано как метод, но с этим. Как я могу передать getCountryName(); как параметр? как показано ниже;

public static String Utils(Something something){ 
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
    List<Address> address = null; 

    if (geoCoder != null) { 
     try { 
      address = geoCoder.getFromLocation(lat, lng, 1); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     if (address.size() > 0) { 
      return address.get(0).getCountryName(); // pass this as parameter (something) 
     } 
    } 
    return null; 
} 

, а затем вызвать его, как это так,

Utils(getCountryName()); 
Utils(getCountryCode()); 
etc. 
+0

Попробуйте вы получите знать. – Spartan

+0

Я пробовал несколько вещей, но есть действительно глупые (имя метода), но в любом случае они не работают – SumOne

+0

Вы можете передать имя метода, которое возвращает что-то (строка, int и т. Д.). Но для прохождения функции вам нужно использовать функции функционального программирования, выражения lamda и т. Д. – Spartan

ответ

1

В Java, что это язык, который вы, наконец, используя. Вы не можете передать метод или функцию в качестве параметра функции. Если вы можете использовать его, из Java 8 у вас есть лямбда-выражения, которые являются своего рода «анонимной» функцией. Попробуйте это.

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

В этом SO ответ у вас есть очень подробное руководство. Java Pass Method as Parameter

В этой теме есть больше информации с некоторыми узорами, если вы не можете использовать java8

+0

Есть ли другой способ достичь этого. Я просто хочу, чтобы иметь возможность вызвать один метод, но получить разные значения обратно. например почтовый индекс, название страны и т.п. – SumOne

+0

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

0

Вы можете использовать отражение.

например.

Method[] methods = Address.class.getMethods(); 
for (Method method : methods){ 
    if(method.getName().equals(param)){ 
     return (String) method.invoke(address.get(0)); 
    } 
} 

param будет иметь тип String со значением метода вы хотите позвонить.

EDIT: Полный пример, используя getMethod(String)

public static String Utils(String param){ 
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
    List<Address> address = null; 

    if (geoCoder != null) { 
     try { 
      address = geoCoder.getFromLocation(lat, lng, 1); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     if (address.size() > 0) { 
      Method method = Address.class.getMethod(param); 
      if(method == null) return null; 
      try{ 
       return (String) method.invoke(address.get(0)); 
      }catch(ReflectiveOperationException e){ 
       // Expected param maybe? 
       return null; 
      } 
     } 
    } 
    return null; 
} 
+0

do I type Method [] methods = Address.class .getMethods(); это как параметр? – SumOne

+0

Нет, ваша подпись метода теперь будет выглядеть как 'public static String Utils (String param)' – Ryan

+0

Я получаю сообщение об ошибке: method.invoke (address.get (0)); говоря о необработанном исключении java.lang.exception.illegalstateexception ... – SumOne

0

попробовать это;

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

public interface Callable { 
    public void getCountryName(); 
    public void getCountryCode(); 
} 

Реализовать класс с методом

class Method_passing implements Callable { 
    public void getCountryName() { 
    //do your task 
    } 

    public void getCountryCode() { 
    //do your task 
    } 
} 

Invoke, как этот

Callable cmd = new Method_passing(); 
//This allows you to pass cmd as parameter and invoke the method call defined in the interface 

public invoke(Callable callable) { 
    cmd.getCountryName(); //return name etc.. 
    cmd.getCountryCode(); 
} 
0

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

public class Address { 
public static final int GET_COUNTRY_NAME = 1; 
public static final int GET_COUNTRY_CODE = 2; 

public String getUtil(int code){ 
    switch(code){ 
    case GET_COUNTRY_NAME: return this.getCountryName(); 
    case GET_COUNTRY_CODE: return this.getCountryCode(); 
    default: return null; 
    } 
} 

private String getCountryName(){ 
    //do something 
    return ""; 
} 

private String getCountryCode(){ 
    //do something 
    return ""; 
}} 

, а затем определить свою функцию как

public static String Utils(int something){ 
Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
List<Address> address = null; 

if (geoCoder != null) { 
    try { 
     address = geoCoder.getFromLocation(lat, lng, 1); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    if (address.size() > 0) { 
     return address.get(0).getUtil(something); 
    } 
} 
return null; }} 

, который будет называться использованием

Utils(Address.GET_COUNTRY_NAME); 
Utils(Address.GET_COUNTRY_CODE);