何が違うの?
エンチャントを付与できるアイテムに違いがある
コードを見てみる
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: }
風のうわさ
追加で調査をしたところ
「ItemStack#addEnchantment は将来廃止されるかもしれないので ItemMeta#addEnchant を使うことを推奨する (意訳)」
という文章を見かけたのでここに記す。
Spigot Forum
"Difference between ItemStack.addEnchantment and ItemMeta.addEnchant""ItemStack#addEnchantment(...) is just an easy-access method, but internally it just calls the ItemMeta#addEnchant(...) method.
You should stick to the latter one though, as the first one might get removed in the future. Other easy-access methods that modify the meta have been removed in the past."
なお、公式声明ではないため信頼性は0である。本当にただの風の噂でしかない。
まとめ
ItemMeta#addEnchant
: どんな状況でもエンチャントを付与できる。ただし、#getItemMeta で呼び出さなければならない。
ItemStack#addEnchantment
: ItemStack から直接操作できる。ただし、ツール類以外にはエンチャントを付与できない。