我正在寻找创建很多方法,我希望用户随机获得一个。什么可能是一个有效的方法来实现这一目标?我可以使用枚举吗?切换声明?
这是一个小例子。
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() {
//
}
答案 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做一些很酷的事......