从存储在hashmap中的类创建新实例

时间:2014-07-01 00:01:55

标签: java class hashmap

我在使用hashmap中的存储类创建新实例时遇到了问题。

我在做: 将类的实例保存到散列映射为referal以通过UIN加载类(唯一的项目名称)((这是一个字符串))

问题: 保存的实例保持不变,导致为保存的每个块放置相同的实例,这导致在加载保存时仅替换一个块。

寻找:我将如何创建一个新实例,以便我可以正确地放置所有块?

代码:

注册:

/*======================Registry===========================*/
public static HashMap<String, Block> registeredBlocks = new HashMap<String, Block>();

public static void registerBlock(Block block){
    registeredBlocks.put(block.getUIN(), block);
}

public static void loadBlocks(){
    registerBlock(new BlockChest());
    registerBlock(new BlockTree());

    System.out.println(registeredBlocks);
    System.out.println(registeredBlocks.containsKey("chestBlock"));
    System.out.println(registeredBlocks.get("chestBlock"));
    System.out.println(Blocks.chest);
}

public static Block getBlockFromUIN(String uin){
    if(registeredBlocks.containsKey(uin)){
        return registeredBlocks.get(uin);
    }
    return null;
}

参考

public static BlockChest chest = (BlockChest)Block.registeredBlocks.get("chestBlock");
public static BlockTree log = (BlockTree)Block.registeredBlocks.get("treeLog");

1 个答案:

答案 0 :(得分:2)

您没有在您的hashmap中存储类:

HashMap<String, Block> registeredBlocks

这是将字符串映射到Block个实例,因此您正在观察的行为。

相反:

HashMap<String, Class> registeredBlocks

将存储Class对象

registeredBlocks.put(block.getUIN(), block.getClass());  //or Block.class

Block类放在你的地图上,不管键是什么键,还是

Block b = (Block)registeredBlocks.get(keyString).newInstance(); 

将为您提供该类的新实例,强制转换为Block

注1:这是使用Class.newInstance()方法。

注2:这纯粹是对你问题的回答。你想要做的事情在你的帖子中并不是很明显,但我相信你有更清洁/更好的方法来实现你想要实现的目标。