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

时间:2014-02-01 13:28:06

标签: java oop structure

关于我的系统:

我正在制作RPG游戏,我希望人们选择一个套件。套件就像一个拥有它自己的效果和物品的类。

现在每个玩家都可以使用命令选择套件。

每个工具包都实现了Kit界面:

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
    }

}

现在在Client对象中,我有这个:

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
    }
}

但我希望解决方案简短,简洁,设计好。 这可能吗?

1 个答案:

答案 0 :(得分:0)

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

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

  public void setKit(Client c) {
    ...
    c.playerKit = DEFAULT_KIT.newItem();
    ...
  }
}