Java解决方案中的动态类创建



我知道这将不起作用,这会使IMO糟透了,但是我想知道什么是最好的解决方案。搜索后,我发现了有关Orm和Hibernate的信息。发现它们后,我发现许多人说它比价值更麻烦并促进懒惰。请任何人指向我的方向好吗?

//Setup the weapon classes
logger.info("Initializing the weapon classes.");
stat = conn.prepareStatement("SELECT *" + 
                            " FROM " + DB_NAME + ".weapons");
rs = stat.executeQuery();
while (rs.next()) {
    Weapon rs.getString("name") = new Weapon(rs.getint("weapon_id"), rs.getString("name"), rs.getString("description"), rs.getString("filename"), rs.getint("rarity"), rs.getint("sell_price"), rs.getint("quantity_max"), rs.getint("slot"), rs.getint("level_requirement"), rs.getint("strength_requirement"), rs.getint("dexterity_requirement"), rs.getint("intelligence_requirement"), rs.getint("enchanted_increase"), rs.getint("enchanted_cost"), rs.getint("hit_min"), rs.getint("hit_max"), rs.getint("speed"), rs.getint("elemental_type"), rs.getint("elemental_hit_min"), rs.getint("elemental_hit_max"));
}

我知道这已经问过很多次,但是我只是发现了这么多矛盾的意见。:(

我建议使用地图存储您从数据库中获取的武器的实例。关键将是名称,值将是您的武器类实例。

类似:

while(rs.next()){
    Weapon weapon = new Weapon(rs.getint("weapon_id"), rs.getString("name"), rs.getString("description"), rs.getString("filename"), rs.getint("rarity"), rs.getint("sell_price"), rs.getint("quantity_max"), rs.getint("slot"), rs.getint("level_requirement"), rs.getint("strength_requirement"), rs.getint("dexterity_requirement"), rs.getint("intelligence_requirement"), rs.getint("enchanted_increase"), rs.getint("enchanted_cost"), rs.getint("hit_min"), rs.getint("hit_max"), rs.getint("speed"), rs.getint("elemental_type"), rs.getint("elemental_hit_min"), rs.getint("elemental_hit_max"));
    //Assuming you have an instance of Map<String, Weapon>
    map.add(rs.getString("name"), weapon);
}

使用ORM取决于您的项目大小。就个人而言,通过查看您对Java的理解,我不会建议您暂时跳入Hibernate等。我建议您首先直接与SQL一起玩,以便您对持久性有更好的了解。

至于您发布的代码,这是您可以做的:

//Setup the weapon classes
logger.info("Initializing the weapon classes.");
stat = conn.prepareStatement("SELECT *" + 
                            " FROM " + DB_NAME + ".weapons");
HashMap<String, Weapon> weapons = new HashMap<String, Weapon>();
rs = stat.executeQuery();
while (rs.next()) {
    Weapon weapon = new Weapon()
        .setId(rs.getint("weapon_id"))
        .setName(rs.getString("name"))
        .setDescription(rs.getString("description"))
        .setFilename(rs.getString("filename"))
        .setRarity(rs.getint("rarity"))
        .setSellPrice(rs.getint("sell_price"))
        .setQuantityMax(rs.getint("quantity_max"))
        .setSlot(rs.getint("slot"))
        .setLvlRequirement(rs.getint("level_requirement"))
        .setStrRequirement(rs.getint("strength_requirement"))
        .setDexRequirement(rs.getint("dexterity_requirement"))
        .setIntRequirement(rs.getint("intelligence_requirement"))
        .setEnchantedInc(rs.getint("enchanted_increase"))
        .setEnchantedCost(rs.getint("enchanted_cost"))
        .setHitMin(rs.getint("hit_min"))
        .setHitMax(rs.getint("hit_max"))
        .setSpeed(rs.getint("speed"))
        .setElementalType(rs.getint("elemental_type"))
        .setElementalHitMin(rs.getint("elemental_hit_min"))
        .setElementalHitMax(rs.getint("elemental_hit_max"));
    weapons.put(rs.getString("name"), weapon);
}

避免使用如此多的参数具有构造函数(甚至是方法!)。除非您将班级导出到第三方或将其暴露给某些用户插件,并且不希望任何人更改内部值,否则不必担心设置器!然后每个set*方法返回this,以便可以链接它们。例如:

public Weapon setHitMax(int max) {
    this.hitMax = max;
    return this;
}

您可以,然后使用Map访问武器。例如,例如:

weapons.get("sword").getHitMax();

"动态类创建"到底是什么意思?我可以从您的代码中了解两件事:

a)您是一个重新糟糕的Java程序员:) 或

b)您正在尝试使数据库中每一行的变量命名不同(这没什么意义)

最新更新