将方法放入数组中

时间:2017-01-06 18:46:45

标签: java arrays methods minecraft

所以我想创建一个包含方法的数组。例如:

public static void givePointBoost(){
points += 30};

public static void giveSword(){
Actions.giveItems(Items.diamond_sword);
Actions.givePotion(Potions.slowness);};

正如您所看到的,这两种方法都是空洞。我想要做的是有一个数组,其中包含所有这些空隙,以便我可以稍后从中选择一个随机方法。但是我不能把它放到一个数组中,因为它说我不能有一系列的空洞。当我试图使它成为一个对象数组时,它说它无法从对象切换到无效。所以我的问题是:

如何在阵列中获取方法?

4 个答案:

答案 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之间的随机数,获取命令实例并执行它。如果您需要在代码中的其他位置执行它,只需从选择随机效果方法返回它。