• home
  • (Android & Java) Lombokでざっくりシャローコピー

(Android & Java) Lombokでざっくりシャローコピー

伏見です。

Lombokとは、JavaでGetter,Setter,コンストラクタなどを自動生成していい感じに隠蔽してくれるツールです。
様々なアノテーションを使って表現します。
Lombok 使い方メモ

現在所属しているチームではモバイルアプリ開発を行っています。
Swift,Web,AndroidのAPIのIOやビジネスロジックの共通の大元をまずTypeScriptで書いており、そこからSwiftやJavaのデータ定義用コードを自動生成して各自で使っています。

Typescriptでデータ用モデルを定義するとき、ゲッターセッターだのまず書いていません。
Androidでの開発においても、最近はREST APIから渡ってくる情報や、アプリケーションのビジネスロジックを表現するようなシンプルなデータ用クラスを、js側で扱うpureなJSONとなるべく見た目的に等価にしておきたい気分でいます。

で、ゲッターセッター、コンストラクタの定義にLombokを使っているわけです。

で、本題ですが、このLombok、オブジェクトの浅いコピーにも使えます。
データ用クラスがCloneableを継承すれば当然Lombokなしでもシャローコピー(?)は実装できますが、前述の理由で余計なinterfaceやメソッドを定義してクラス内を汚したくないです。

(参考にしたリンク)

定義側
[java]

@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true) //<-これ
public class PlayerStore {

public int nowPlayOrder = 0;

}

[/java]

使用側
[java]

        PlayerStore oldPlayerStore = allStore.playerStore;
        PlayerStore oldPlayerStore2 = allStore.playerStore;

        oldPlayerStore.nowPlayOrder = 20;

        Log.d(&quot;&quot; , oldPlayerStore2.nowPlayOrder+&quot;&quot;); //20
        Log.d(&quot;&quot; , allStore.playerStore.nowPlayOrder + &quot;&quot;); //20

        allStore.playerStore = oldPlayerStore.toBuilder().build();
        oldPlayerStore.nowPlayOrder = 120;

        Log.d(&quot;&quot; , oldPlayerStore2.nowPlayOrder+&quot;&quot;); //120
        Log.d(&quot;&quot; , allStore.playerStore.nowPlayOrder + &quot;&quot;); //20

[/java]

結果は以上のような感じになります。

便利。
Android用オレオレRedux実装のReducerにあたる部分で使う予定ですが、他に使う場面あるかな…。