Я пытаюсь выбрать случайный метод из тех, что созданы внутри класса. Есть ли способ создать ArrayList и передать ему методы? Я попытался сделать именно это, но при добавлении метода в массив получаю сообщение об ошибке.

public class Monkey{

    private int energy;

    String[] food = {"Meat", "Fish", "Bugs", "Grain"};
    ArrayList<Activity> monkeyActivity = new ArrayList<>();

    public Monkey(int energy) {
        this.energy = energy;
    }

    public int getEnergy() {
        System.out.println("Monkey energy level: " + energy);
        return energy;
    }

    public void sound() {
        System.out.println("Monkey: Oooo Oooo~!");
        energy -= 3;
        monkeyActivity.add(sound()); //I get an error message here when trying 
                                 //to add the method to the array
    }

    public void play(){
        if (energy >= 8){
            System.out.println("Monkey begins to play.");
            energy -= 8;
        }else {
            System.out.println("Monkey does not have enough energy to play");
        }
        System.out.println("Energy remaining: " + energy);
    }

    public void eat(){
        Random random = new Random();
        int index = random.nextInt(food.length);
        System.out.println("Monkey beings to eat " + food[index]);
        energy += 5;
        System.out.println("Energy remaining: " + energy);
    }

    public void sleep(){
        System.out.println("Monkey is sleeping: Zzz...");
        energy += 10;
        System.out.println("Energy remaining: " + energy);
    }
}

Это отдельный класс, который я сделал для общего Activity ..

public class Activity {

    private String sleep;
    private String eat;
    private String sound;
    private String play;

    public Activity(String sleep, String eat, String sound, String play) {
        this.sleep = sleep;
        this.eat = eat;
        this.sound = sound;
        this.play = play;
    }

    public String getSleep() {
        return sleep;
    }

    public String getEat() {
        return eat;
    }

    public String getSound() {
        return sound;
    }

    public String getPlay() {
        return play;
    }

    public void setSleep(String sleep) {
        this.sleep = sleep;
    }

    public void setEat(String eat) {
        this.eat = eat;
    }

    public void setSound(String sound) {
        this.sound = sound;
    }

    public void setPlay(String play) {
        this.play = play;
    }
}
0
bgongre 30 Дек 2017 в 20:17

2 ответа

Лучший ответ

Вы можете сохранить каждый метод как Runnable, поскольку любое "действие" - это метод void без аргументов, удовлетворяющий функциональному интерфейсу Runnable:

List<Runnable> actions = Arrays.asList(this::sound, this::play, this::eat, this::sleep);

Чтобы выполнить случайный метод, просто:

Random rnd = new Random();
actions.get(rnd.nextInt(actions.size())).run();
1
Alex Salauyou 30 Дек 2017 в 19:17

Вы путаете понятия.

Технические неполадки:

Конфликт возвращаемых значений

public void sound() {
    // ...
    monkeyActivity.add(sound());

Возвращаемое значение вашего метода sound() - void (что означает отсутствие возвращаемого значения ), но вы пытаетесь добавить его (не существующее) возвращаемое значение как элемент в список. Это то, на что жалуется ваш компилятор.

Непреднамеренная рекурсия

public void sound() {
    System.out.println("Monkey: Oooo Oooo~!");
    energy -= 3;
    monkeyActivity.add(sound());

В последней строке вы выполняете рекурсивный вызов , что означает, что вы вызываете точно такой же метод, в котором находится этот код. Если это происходит непреднамеренно, это почти всегда приводит к StackOverflowError.

Уроки письма без должного анализа

У вас есть класс Activity. Но если вы присмотритесь, это не отдельное действие (как следует из названия классов), а все возможные действия .

В результате ваша коллекция monkeyActivity не может содержать отдельные действия как элементы.

Делая безумное предположение, я думаю, что то, что вы хотели, больше похоже на это:

interface Activity{
  void do();
}

public class Monkey{
    private int energy;
    String[] food = {"Meat", "Fish", "Bugs", "Grain"};
    List<Activity> monkeyActivity = new ArrayList<>();
    // ...        
    public void sound() {
        monkeyActivity.add(new Activity(){
              public void do(){                
                System.out.println("Monkey: Oooo Oooo~!");
                energy -= 3;
              }
           }); 
    }
2
Timothy Truckle 30 Дек 2017 в 17:53