我想创建一个 OreBase 类,这样我就不会为每个新矿石创建一个新类,因为它们几乎应该做完全相同的事情:1.存在,2.放下在矿石名称(ruby_ore-> ruby)的下划线之前命名的适当项目。要为ruby_ore返回红宝石,我需要返回 ModItems.RUBY ,我可以从“ ruby_ore” 中获取字符串“ RUBY” ,但是我不知道如何在“ ModItems。” 之后正确添加它。这可能吗?
如果不可能,是否可以放置“ ModItems。” 和项目字符串ex。 “ RUBY” 在单个字符串中。 “ ModItems.RUBY” 并将该字符串作为代码运行?
@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
int a = ore_name.indexOf('_'); //ex. ore_name = ruby_ore
String b = ore_name.substring(0,a); //ex. ruby
String c = b.toUpperCase();//ex. RUBY
return ModItems.b;//i want this to do ex. ModItems.RUBY
}
因此,如果ore_name是ex。 biotite_ore 函数应返回 ModItems.BIOTITE ,对于 pyroxine_ore 它应返回 ModItems.PYROXINE ,依此类推。>
答案 0 :(得分:2)
至少有3种方法可以做到这一点。随便吧。
1。使ModItems
成为包含Item
对象的枚举:
int a = ore_name.indexOf('_');
String b = ore_name.substring(0,a);
String c = b.toUpperCase();
return ModItems.valueOf(c).getItem();
优点:很简单,如果添加了新项目,则无需更新地图
缺点:如果ModItem
不存在,则会引发异常
2。制作Map<String, ModItem>
(首选):
return oreMap.get(ore_name);
优点:简单,易于实现
缺点::每次添加项目时,您都必须更新地图,get
对于未知矿石返回null
3。反思:
int a = ore_name.indexOf('_');
String b = ore_name.substring(0,a);
String c = b.toUpperCase();
return ModItems.class.getDeclaredField(c).get(null);
优点::无需为每个新项目更新地图
缺点:过度杀伤,抛出难看的异常检查,除非绝对必要,否则通常会皱眉。