ゲーム好きな豚のしっぽ

筆者の下手の横好きなゲーム日記、情報メモです。主にプレイするのはtrophymanager、WoT、WoWS、洋モノSLGなどの予定。

net.minecraftforge.common.capabilities.Capability

注意事項

このリファレンスは筆者が記述した時点での拙い知識で翻訳、解釈したもののメモです。
誤訳や理解不足の可能性を多分に含みます。ご覧になる際はご注意ください。
ソースは1.8.9 - 11.15.1.1722のものを使用しています。

net.minecraftforge.common.capabilities.Capability

Forgeが追加する、NBTでの永続化が可能なオブジェクトのホルダ。おそらくは、ある機能を実現するオブジェクトをクラスの拡張や書き換えを行わずに動的に追加するための機構。有効な使い道がぱっとは浮かんでこない。

クラス宣言
public class Capability<T>
内部インターフェイス
public static interface IStorage<T>

T型を保存するためのインターフェイス。Capabilityクラスしか使用しないとはいえ拡張しないと使えないものを内部で宣言する理由はない。

IStorageのメソッド
NBTBase writeNBT(Capability<T> capability, T instance, EnumFacing side)
void readNBT(Capability<T> capability, T instance, EnumFacing side, NBTBase nbt)

CapabilityインスタンスをNBTTagにシリアライズ、デシリアライズします。
これをデータセーブのセントラル実装にすることができます。

重要な注意点として、Capabilityにどのようなインスタンス値が必須であるかはそのAPI定義次第です。
インターフェイスは利用できるメソッドを定義するだけなのでそのインスタンスのフィールドについては保証できない。
Capability自体はあくまでも情報伝搬の手段で、機能そのものはT型のオブジェクトの実装による。
T型オブジェクトの実装が変更されてもその情報を読み書きするためのインターフェイスは保障されるため、Capabilityは安全に機能する(はず)という思想かと思われる。

内部のデータを操作する可能性を考えると、「とある実装」は「デフォルト実装」のインスタンスを含んでいる必要があるかもしれません。
よくわかりません

メソッド
public String getName()

Capabilityの一意な名前を返します。一般的にはこれはターゲットになるインターフェイスの完全修飾名です。

public IStorage<T> getStorage()

デフォルトのストレージハンドラのインスタンスを返します。あなたはこれをあなたのNBTのデフォルト実装として安全に使用できます。

public T getDefaultInstance()

デフォルト実装のインスタンスを返します。デフォルトのストレージを使用したい場合、この正確に実装されたデフォルトを使用する必要があることが注意点です。
問題となるCapabilityの所有するAPIを参照してください。
どのみちT型の中身を把握していないと「デフォルトではない実装」を使用できないはずなので、正確に実装しろよという警告

コンストラクタ
Capability(String name, IStorage<T> storage, Callable<? extends T> factory)

フィールドをすべて外部から受け取る潔い設計。java8では第3引数のfactoryは関数インターフェイスに置き換えできる。