(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("" , oldPlayerStore2.nowPlayOrder+""); //20
Log.d("" , allStore.playerStore.nowPlayOrder + ""); //20
allStore.playerStore = oldPlayerStore.toBuilder().build();
oldPlayerStore.nowPlayOrder = 120;
Log.d("" , oldPlayerStore2.nowPlayOrder+""); //120
Log.d("" , allStore.playerStore.nowPlayOrder + ""); //20
[/java]
結果は以上のような感じになります。
便利。
Android用オレオレRedux実装のReducerにあたる部分で使う予定ですが、他に使う場面あるかな…。