Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类型保存到变量中并使用它创建新实例_Java_Oop_Structure - Fatal编程技术网

Java 将类型保存到变量中并使用它创建新实例

Java 将类型保存到变量中并使用它创建新实例,java,oop,structure,Java,Oop,Structure,关于我的系统: 我正在做一个RPG游戏,我想让人们选择一个工具包。工具包就像一个类,它有自己的效果和物品 现在每个玩家都可以使用命令选择一套装备 每个套件实现套件接口: public interface Kit { public void addItems(); public void execute(); } 工具包类的示例: public class Warrior implements Kit { private Client player; pu

关于我的系统:

我正在做一个RPG游戏,我想让人们选择一个工具包。工具包就像一个类,它有自己的效果和物品

现在每个玩家都可以使用命令选择一套装备

每个套件实现套件接口:

public interface Kit {

    public void addItems();
    public void execute();

}
工具包类的示例:

public class Warrior implements Kit {

    private Client player;

    public Warrior(Client c) {
        this.player = c;
    }

    /**
     * Adds item to the player.
     */

    @Override
    public void addItems() {
        for (Integer item : PlayerKits.WARRIOR.getItems()) {
            this.player.getItems().addItem(item, 1);
        }
    }

    /**
     * This is used for kits effects.
     */

    @Override
    public void execute() {
        // TODO add a task scheduler and handle kit effects
    }

}
现在在客户端对象中,我有:

public Kit playerKit = null;
我的问题是:

如果玩家没有选择装备,系统将使用默认装备。 我想将默认工具包类型存储到最终变量中,以便系统动态地使用默认工具包类型作为实例

不可编译示例:

private final Kit DEFAULT_KIT = Warrior;

public void setKit(Client c) {
    if (c.playerKit != null) {
        c.playerKit.addItems();
        c.playerKit.execute();
    } else {
        c.playerKit = new DEFAULT_KIT();
        c.playerKit.addItems();
        c.playerKit.execute();          
    }
}
这基本上显示了我想要实现的想法,但我认为不可能将类型存储到变量中,然后使用它们创建新实例

我当然可以做到:

private final PlayerKits DEFAULT_KIT = PlayerKits.WARRIOR;

public void getType() {
    switch(DEFAULT_KIT) {
        case WARRIOR:
            return new Warrior();
            break;
        // ... more cases
    }
}
但我希望解决方案简短、简单、设计好。
这可能吗?

Java中的类型在运行时表示为类。对类的引用可以存储在如下变量中:

private final Class<Kit> DEFAULT_KIT = Warrior.class;

  public void setKit(Client c) {
    ...
    c.playerKit = DEFAULT_KIT.newItem();
    ...
  }
}
private final Class DEFAULT\u KIT=Warrior.Class;
公共无效设置套件(客户端c){
...
c、 playerKit=DEFAULT_KIT.newItem();
...
}
}

在这里使用
Spring
进行依赖项注入将非常有效或使用
公用工具包playerKit=new Warrior()?此外,您应该修改您的设计:字段不应该是公共的,从客户机到工具包,从工具包到客户机的循环引用通常是个坏主意。最后,所有大写字母都是常量:静态最终字段。@JBNizet我希望它是动态的,所以我只需要在一个地方更改类型。如果明天我想创建多个RPG竞技场或更多类似的游戏,目的相同,或者在另一个地方做同样的事情,该怎么办?我只需要更改类型并完成。我知道我只是在使用示例,不想为示例创建getter。关于决赛,谢谢你,我不知道
Kit playerKit=new Warrior()使用默认为战士的工具包初始化客户端的所有实例。它在一个地方,没有重复。如果客户机以外的其他类型的对象也需要与客户机相同类型的默认工具包,则使用
kit kit=Kits.createDefaultKit()所有需要默认工具包的地方。因此,默认工具包的选择将封装在
Kits.createDefaultKit()
方法中,在需要默认工具包的任何地方都可以使用该方法。@jbnize如果我不知道你从哪里得到答案,我会这样做。非常感谢。