bgongre
bgongre

Reputation: 65

Selecting Random Method From Multiple Methods

I am trying to select a random method from the ones created inside the class. Is there a way to create an ArrayList and pass methods to it? I have attempted to do just that but I am getting an error when I try to add the method to the array.

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);
    }
}

This is the separate class I have made for the generic 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;
    }
}

Upvotes: 0

Views: 116

Answers (2)

Alex Salauyou
Alex Salauyou

Reputation: 14338

You may store each method as Runnable, as any "action" is no-arg void method satisfying Runnable functional interface:

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

to execute random method, just:

Random rnd = new Random();
actions.get(rnd.nextInt(actions.size())).run();

Upvotes: 1

Timothy Truckle
Timothy Truckle

Reputation: 15622

You are mixing up concepts.

technical issues:

return value clash

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

The return value of your method sound() is void (which means no return value), but you try to add its (not existing) return value as element to the List. This is what your compiler complains about.

unintended recursion

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

In the last line you do a recursive call which means you call exactly the same method this code is in. If that happens unintended it almost ever results in a StackOverflowError.

writing classes without proper analysis

You have a class Activity. But if you have a closer look this is not a single activity (as the classes name implies) but it is all possible activities.

As a result your collection monkeyActivity cannot hold single activities as elements.

Doing a wild guess I think what you wanted is more like this:

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;
              }
           }); 
    }

Upvotes: 2

Related Questions