存储方法并随机调用它们?

时间:2017-05-27 18:45:40

标签: java

我正在寻找创建很多方法,我希望用户随机获得一个。什么可能是一个有效的方法来实现这一目标?我可以使用枚举吗?切换声明?

这是一个小例子。

private void giveAssignment() {
    Random randomTask = new Random();
    int assignments = 3;
    assignments = randomTask.nextInt(assignments);
    switch(assignments) {
    case 0:
        doSomething();
        break;
    case 1:
        doSomethingElse();
        break;
    case 2:
        doAnotherThing();
        break;
    }
}

private void doSomething() {
    //
}

private void doSomethingElse() {
    //
}

private void doAnotherThing() {
    //
}

2 个答案:

答案 0 :(得分:5)

您可以将它们存储在Runnable的列表(或数组)中,您可以使用方法引用轻松填充它们:

private void giveAssignment() {

    List<Runnable> methods = Arrays.asList(
        this::doSomething,
        this::doSomethingElse,
        this::doAnotherThing);

    int assignments = randomTask.nextInt(methods.size());
    methods.get(assignments).run();
}

这似乎比使用交换机更具可扩展性:将新方法添加到选项列表中要容易得多。您甚至不一定需要实际定义方法;

List<Runnable> methods = Arrays.asList(
    this::doSomething,
    this::doSomethingElse,
    this::doAnotherThing,
    () -> { /* some other code to execute here */ }
);

答案 1 :(得分:0)

切换可能很好 - 尽管扩展其他“可能发生某些事情的方式”会让你在创建新行为的基础上扩展相同的代码。

解决这个问题的另一种方法是为要完成的事情定义一个公共接口:

public interface Something {
  public void nowMakeItHappen();
}

然后实现实现此接口的不同行为:

public class OneThing  implements Something {
  public void nowMakeItHappen() {
    //do it here
  }
}
public class SecondThing  implements Something {
  public void nowMakeItHappen() {
    //do it here
  }
}

然后在您的主要课程中,您可以列出可能要做的事情:

List<Something> waysToDoThings = new ArrayList<Something>();
waysToDoThings.add(new OneThing());
waysToDoThings.add(new SecondThing());

然后随机选择一件事:

assignments = randomTask.nextInt(waysToDoThings.size());
waysToDoThings.get(assignments).nowMakeItHappen();

原因你现在必须将新的子类添加到列表中 - 但我觉得与switch相比,这样做的努力会更少。

最终,您甚至可以考虑为适合您的模式的类创建一个Annotation,并获取所有注释的类并实现要添加到列表中的接口...

也许有可能在这里用Lambdas做一些很酷的事......