2015-04-15 5 views
-1

Я четыре метода так создано:Можно ли получить getMethodX с помощью for?

method1(); 
method2(); 
method3(); 
method4(); 

Могу ли я использовать это, как это?

for (int i = 1; i <= 4; i++) { 
    method+i+(); // ? 
} 
+0

Использование шаблона команды и добавление команд в коллекцию может выполнить что-то близкое. – chiaboy

+0

Что должен делать 'метод + i +()'? – WonderWorld

+0

Он пытается вызвать метод с именем «method» + i. Это псевдокод. – Claudio

ответ

1

Вы можете использовать Reflection для этого, но это несколько ужасно.

Class<TheClassThatHasSuchMethods> clazz = this.getClass(); 
for (int i=0; i < 4; i++) { 
    Method method = clazz.getMethod("method" + i); 
    method.invoke(this); 
} 

Будьте готовы к обработке тонны исключений

+0

Предполагая много вещей: они являются методами экземпляра, общедоступными, и они помещаются в класс, к которому принадлежит это «это». – Claudio

0

Вы можете использовать отражение. Отражение сложно и плохо работает, поэтому вы должны подумать о том, действительно ли вы действительно хотите продолжить.

Однако, код будет выглядеть

for (int i = 1 ; i <= 4; i++) { 
    Method method = this.getClass().getDeclaredMethod("method"+i); 
    method.invoke(this); 
} 

предполагающего метода не является статичной и определена в текущем классе.

2

Существует несколько способов сделать это, но в целом это предполагает, что вы неправильно структурировали программу. Вы можете сделать это.

for (int i = 1; i <= n; i++) 
    getClass().getMethod("method" + i).invoke(); 

Или у вас может быть длинный метод, который сочетает в себе все необходимые функции.

Альтернатива в Java 8, чтобы сделать это

Runnable[] runs = { 
    this::methodOne, 
    this::methodTwo, 
    this::methodThree, 
    this::methodFour, 
    this::methodFive, 
    this::methodSix }; 

for (int i = 0; i < n; i++) 
    runs[i].run(); 
+0

У меня есть всего 6 методов. Если n = 2, мне нужно запустить 2 метода, если n = 4 4 метода ecc. Это моя проблема. И методы имеют некоторые параметры – pippo15

+0

@ pippo15 Добавили альтернативу, свободную от отражения. –

+0

Это еще не '@ FunctionalInterface' в JDK, кроме« Runnable », чтобы это сделать? –

1

Если вы используете Java 8, вы можете разместить ссылки на метод в Map, а затем получить доступ к ним по имени.

Если предположить, что ваши методы в классе, таких, как это:

public class Test 
{ 
    public void method1() { System.out.println("Method 1!"); } 
    public void method2() { System.out.println("Method 2!"); } 
    public void method3() { System.out.println("Method 3!"); } 
    public void method4() { System.out.println("Method 4!"); } 
} 

Ключ имя метода.

Map<String, Runnable> methodMap = new HashMap<String, Runnable>(); 
Test test = new Test(); 
methodMap.put("method1", test::method1); 
methodMap.put("method2", test::method2); 
methodMap.put("method3", test::method3); 
methodMap.put("method4", test::method4); 

for (int i = 1; i <= 4; i++) 
{ 
    String methodName = "method" + i; 
    Runnable method = methodMap.get(methodName); 
    method.run(); 
} 

Выход:

Method 1! 
Method 2! 
Method 3! 
Method 4! 

Если ваши методы принимают некоторые параметры и/или возвращает значение, то вам необходимо выбрать другой функциональный интерфейс, отличный от Runnable.

  • Поставщик или [Boolean | Int | Double | Long] Поставщик возвращает значение без параметров.
  • Потребительский или [Boolean | Int | Double | Long] Потребитель принимает параметр без возврата значения.
  • Различные Function-подобные интерфейсы для принятия параметра и возврата функции.

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

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