【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对象中操作。不过,只能给工具类物品附魔,其他物品无法附魔。