我知道这将不起作用,这会使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)您正在尝试使数据库中每一行的变量命名不同(这没什么意义)