有没有一种方法可以在点的末尾添加字符串而无需手动键入?

时间:2019-05-03 22:52:28

标签: java minecraft-forge

我想创建一个 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 ,依此类推。

1 个答案:

答案 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);

优点::无需为每个新项目更新地图
缺点:过度杀伤,抛出难看的异常检查,除非绝对必要,否则通常会皱眉。