Как вызывать методы в случайном порядке (Java JDK11)? - PullRequest
2 голосов
/ 27 марта 2020
class Scratch {

    public void meth1(){

    }
    public void meth2(){

    }
    public void meth3(){

    }
    public void meth4(){

    }
    public void meth5(){

    }
    public static void main(String[] args) {
        int randomNumber=(int)Math.random()*5;
    }
}

Здесь у меня есть 5 методов, и я хочу вызывать их случайным образом. Я новичок в OOP, но знаю немного о C, в этом случае я бы сохранил адреса функций (методов) в массиве, сгенерировал бы случайное число между [0,4] и вызвал бы функции используя массив в случайном порядке. Но в Java я не знаю, как получить адрес памяти метода. Как мне это сделать?

Ответы [ 3 ]

6 голосов
/ 27 марта 2020

Это делается с помощью переменной функции типа Runnable и ее метода Runnable#run.

Scratch s = new Scratch();
List<Runnable> methods = new ArrayList<>();
methods.add(s::meth1); // This is how you reference a method itself.
methods.add(s::meth2);
...
methods.get(1).run(); // This is how you tell the runnable to execute its code.

Абстрактный метод run - это переопределен имеющимся у вас кодом, таким образом, это «ссылка» для вызова вашего метода. В пакете java.util.function вы можете найти множество классов, которые можно использовать для случая, когда ваш метод имеет параметр или / и возвращает.


Редактировать (Спасибо @ Наман)

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

int randomNumber = new Random().nextInt(methods.size());
methods.get(randomNumber).run();
1 голос
/ 27 марта 2020

Самый простой способ - поместить ваши методы в оператор switch и получить случайное значение следующим образом:

class Scratch {

    public void meth1(){

    }
    public void meth2(){

    }
    public void meth3(){

    }
    public void meth4(){

    }
    public void meth5(){

    }
    public static void main(String[] args) {
      Random r = new Random();
      Scratch scratch = new Scratch();
      int num = r.nextInt(5);
      switch(num) {
        case 0:
          scratch.meth1();
          break;
        case 1:
          scratch.meth2();
          break;
        case 2:
          scratch.meth3();
          break;
        case 3:
          scratch.meth4();
          break;
        case 4:
          scratch.meth5();
          break;
      }
    }
}
0 голосов
/ 27 марта 2020

Это немного утомительно, но вы можете установить определенный диапазон для метода. Например:

public static void main(String[] args) {
    int rand=(int)Math.random()*5;

    if(rand < 0.1) {
        meth1();
    } else if(rand < 0.2) {
       meth2();
    } else if(rand < 0.3) {
       //etc...
    }
}
...