所以我想创建一个包含方法的数组。例如:
public static void givePointBoost(){
points += 30};
或
public static void giveSword(){
Actions.giveItems(Items.diamond_sword);
Actions.givePotion(Potions.slowness);};
正如您所看到的,这两种方法都是空洞。我想要做的是有一个数组,其中包含所有这些空隙,以便我可以稍后从中选择一个随机方法。但是我不能把它放到一个数组中,因为它说我不能有一系列的空洞。当我试图使它成为一个对象数组时,它说它无法从对象切换到无效。所以我的问题是:
如何在阵列中获取方法?
答案 0 :(得分:2)
在Java中,您没有委托或函数指针,您可以将它们存储在集合或数组中,如对象,因此您必须使用Command Pattern来实现此目的。基本上,您将方法包装在传递的对象中。接收器然后可以通过对象访问该方法。
创建命令界面:
interface ICommand {
public void execute();
}
通过继承将一个方法(或多个)包装在一个类中......
class SpecificCommand implements ICommand {
public void execute() {
// Do something...
}
}
...或直接在匿名类中包装现有方法:
class SomeClass {
private void someMethod(int someValue) {
// Some stuff...
}
public static void main(String[] args) {
List<ICommand> commands = new ArrayList<>();
// Do something...
// Add command directly
ICommand command = new ICommand() {
@Override
public void execute() {
someMethod(42);
}
}
// Do something....
}
}
以循环(或单个)方式调用列表中的命令:
for (ICommand command : commands) {
command.execute();
}
答案 1 :(得分:0)
让我们解决问题 Java中的数组只能包含对象或基元 Java中的集合只能包含对象 您正在寻找的内容称为命令模式。 https://www.tutorialspoint.com/design_pattern/command_pattern.htm
您将拥有一个对象列表,每个对象都采用单一方法,让我们说&#34;执行&#34;。使用多态性,每个对象都会做一些不同的事情。
以下是一个例子:
import java.util.ArrayList;
import java.util.List;
public class CommandPatternExample {
public static void main(String[] args) {
List<Command> commands = new ArrayList<>();
commands.add(new GiveBoostCmmand("knight"));
commands.add(new GiveItemCommand("sword", "knight"));
for (int i = 0; i < 3; i++) {
commands.get((int)(Math.random() * commands.size())).execute();
}
}
public interface Command {
void execute();
}
static class GiveBoostCmmand implements Command {
private String targetName;
public GiveBoostCmmand(String targetName) {
this.targetName = targetName;
}
public void execute() {
System.out.println("Boosting " + this.targetName);
}
}
static class GiveItemCommand implements Command {
private String itemName;
private String targetName;
public GiveItemCommand(String itemName, String targetName) {
this.itemName = itemName;
this.targetName= targetName;
}
public void execute() {
System.out.println("Giving " + this.itemName + " to " + this.targetName);
}
}
}
答案 2 :(得分:0)
您是否想要将方法的结果添加到数组中?
据我所知,我不认为你可以把一个方法放在一个数组中。
您可以做的是创建一个接口,并提供实现,然后将这些对象添加到数组中。这样你就可以选择一个随机对象并调用接口中定义的方法。
答案 3 :(得分:0)
主要问题是为什么你需要数组中的方法?
使用Command模式的其他解决方案是一个很好的解决方案。但是看到你的代码我相信你也应该将这个模式放在一个专门的类中,其目的是初始化可能的操作池,并在需要时随机选择一个。
哪个会转换为以下UML
|RandomActionCaller |
|------------------------|
|- List<Command> commands|
|------------------------|
|+ selectRandomEffect() |
在构造函数中,您准备了可能结果的基本列表,请参阅有关Command模式的其他答案。也许还添加了一个方法来向类外部的命令列表添加更多命令,这可能很有用。
选择随机效应方法只会选择0和commands.size() - 1之间的随机数,获取命令实例并执行它。如果您需要在代码中的其他位置执行它,只需从选择随机效果方法返回它。