【Spigot】ItemStack#addEnchantment 与 ItemMeta#addEnchant 的区别是什么?
有什么不同吗?
可以附魔的物品有所不同。
让我看看代码。
Spigot中的ItemStack#addEnchantment
在第398行调用了429行至434行的addUnsafeEnchantment(Enchantment,int)。
398: addUnsafeEnchantment(ench, level);
429: public void addUnsafeEnchantment(@NotNull Enchantment ench, int level) {
430: ItemMeta itemMeta = (meta == null ? meta = Bukkit.getItemFactory().getItemMeta(type) : meta);
431: if (itemMeta != null) {
432: itemMeta.addEnchant(ench, level, true);
433: }
434: }
由于在第432行调用了itemMeta#addEnchant,所以ItemStack#addEnchantment和ItemMeta#addEnchant看起来是相同的行为… 但是,在第394、395、396行中,如果是除了工具之外的物品,会抛出IllegalArgumentException,所以有一些差异。 (只有.canEnchantItem为true的物品是工具类)
394: else if (!ench.canEnchantItem(this)) {
395: throw new IllegalArgumentException("Specified enchantment cannot be applied to this itemstack");
396: }
风声四起
在进行追加调查之后
出于可能废弃的考虑,建议使用ItemMeta#addEnchant而不是ItemStack#addEnchantment。(意为)
因为看到了这篇文章,所以在这里记录下来。
Spigot 论坛
“ItemStack.addEnchantment 和 ItemMeta.addEnchant 之间的区别”
“ItemStack#addEnchantment(…) 只是一个简化的访问方法,但在内部它实际上调用了 ItemMeta#addEnchant(…) 方法。
你应该坚持使用后者,因为第一个可能在将来被移除。之前已经移除了其他修改元数据的简化访问方法。”
然而,由于它不是官方声明,因此其可信度为零。实际上仅仅是空穴来风的谣言。
总结
ItemMeta#addEnchant: 无论什么情况下都可以添加附魔效果,但必须通过#getItemMeta来调用。
addEnchantment方法:可以直接从ItemStack对象中操作。不过,只能给工具类物品附魔,其他物品无法附魔。