Subscribed unsubscribe Subscribe Subscribe

Islands in the byte stream

Technical notes by a software engineer

Android Orma v2.4.0でtype adapterを一つのクラスに集約できるようにした

Orma v2.4.0をリリースしました。差分は大きいですが、アノテーションプロセッサのリファクタがほとんどです。

Ormaのtype adapterは static type adapters というやつで、コンパイル時にtype adapterの検索と呼び出しの埋め込みを行うので動的に処理するものとくらべて高速でしかもコンパイル時にエラーを検出できるという特徴があります。

これについては以前少し説明したことがありました。

Android ORMでオブジェクトの埋め込みはどのように実装するか - Islands in the byte stream

Orma v2.4.0 では、このtype adapterを一つのクラスに集約できるようになりました。どのみちstatic methodしか使わないのですし、集約するほうが見通しがいいと思います。

構文としては、本当はJava8のrepeating annotationsができればいいのですが、それはできなかったので同じことをJava8以前の構文でやる方法をとりました。 MutableIntMutableLong のtype adapterを一つのクラスにまとめるとこんな感じです。補完をつかって書けないのがつらいところですが、それはstatic methodを使う以上は仕方ないですね。

@StaticTypeAdapters({
    @StaticTypeAdapter(
        targetType = MutableInt.class,
        serializedType = int.class,
        serializer = "serializeMutableInt",
        deserializer = "deserializeMutableInt"
    ),
    @StaticTypeAdapter(
        targetType = MutableLong.class,
        serializedType = long.class,
        serializer = "serializeMutableLong",
        deserializer = "deserializeMutableLong"
    )
})
public class TypeAdapters {

    public static int serializeMutableInt(@NonNull MutableInt target) {
        return target.value;
    }

    @NonNull
    public static MutableInt deserializeMutableInt(int deserialized) {
        return new MutableInt(deserialized);
    }

    public static long serializeMutableLong(@NonNull MutableLong target) {
        return target.value;
    }

    @NonNull
    public static MutableLong deserializeMutableLong(long deserialized) {
        return new MutableLong(deserialized);
    }
}