Si hay 3 métodos en

public class Hero extends GameCharacter {

public void test1(){}; 
public void test2(){}; 
public void test3(){};

¿Es posible mientras se ejecuta esto en

public class MainClass extends ApplicationAdapter implements InputProcessor {
@Override
public void create () {
private Hero mainHero;
For (int x = 0; x < 0; x++)
    ....

Correr

mainhero.testx

?

2
Alexey Furi 22 oct. 2017 a las 10:38

3 respuestas

La mejor respuesta

Podrías usar la reflexión, pero debes evaluar mejores patrones para esto.

Las soluciones alternativas incluyen

Condicionales

public void test(int x){
    switch (x) {
       case 1:
          // Things for x == 1
          break;
    }
}; 

OOP, para cuando tienes diferentes tipos de héroes

public abstract class Hero extends GameCharacter {
    public abstract void test();
}

public class Hero1 extends Hero {
    @Override
    public void test() {}
}

...

List<Hero> heroes  = ... ;
heroes.add(new Hero1());
for (Hero h : heroes) { h.test(); }

O simplemente llame a todos sus métodos de prueba por separado a través de métodos de prueba de unidad independientes.

1
OneCricketeer 22 oct. 2017 a las 08:43

Como se sugirió anteriormente, podría usar la reflexión para esto. Este ejemplo usa la reflexión para demostrar eso.

public void callYourClassMethod(String x) {
  try {
    YourClass yourClass = new YourClass()
    Method method = YourClass.class.getDeclaredMethods("methodname" + x);
    method.setAccessible(true); // Only needed if it's not accessible from calling class.
    method.invoke(yourClass); // Assuming your method doesn't take any arguments.
  } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
    System.err.println("Method methodname" + x + "is not declared.");
    e.printStackTrace();
  }
}
0
Sudipto Sarkar 22 oct. 2017 a las 08:19

Esta situación es adecuada para Patrón de estrategia. Básicamente tiene una variación en la funcionalidad, por lo que crea una interfaz para ejecutarla y crea múltiples implementaciones de la misma. Podría verse más o menos así:

package test;

public class Test {

    public static interface TestStrategy {
        void test();
    }

    public static class Test1 implements TestStrategy {

        @Override
        public void test() {
            System.out.println("1");
        }

    }

    public static class Hero {
        TestStrategy test[] = new TestStrategy[]{
            //either use defined class
            new Test1(),
            //or inline
            () -> {System.out.println("2");}
        };
    }

    public static void main(String[] args) {
        Hero hero = new Hero();
        for (int i = 0; i < hero.test.length; i++) {
            hero.test[i].test();
        }
    }
}
3
Coderino Javarino 22 oct. 2017 a las 08:10