Java apache commons DiffBuilder サンプルプログラム
DiffBuilderの説明(google翻訳)
Diffable.diff(Object)メソッドの実装を支援します。
このクラスを使用するには、次のようにコードを記述します。
public class Person implements Diffable
{
String name;
int age;
boolean smoker;…
public DiffResult diff(Person obj){
// NullPointerExceptionとしてobjがnullの場合、nullチェックの必要はありません
return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
.append( “name”、this.name、obj.name)
.append( “age”、this.age、obj.age)
.append( “smoker”、this.smoker、obj.smoker)
.build();
}
}コンストラクタに渡されたToStringStyleは返されたDiffResultに埋め込まれ、DiffResult.toString()メソッドのスタイルに影響します。このスタイルの選択は、DiffResult.toString(ToStringStyle)を呼び出すことでオーバーライドできます。
説明そのままなのですが、オブジェクトの値を比較します。
オブジェクトを作成する際に、Diffable.diff(Object)メソッドをオーバーライドし、その中身を書く際に利用します。
DiffBuilder
package jp.pjin.tech.java; import java.util.Arrays; import java.util.List; import jp.pjin.tech.java.domain.ItemOrder; import org.apache.commons.lang3.builder.DiffResult; public class CommonsExample15 { public static void main(String[] args) throws Exception { List<ItemOrder> orders = Arrays.asList( new ItemOrder(1, "大山", "リンゴ", 150, 12), new ItemOrder(2, "田中", "みかん", 70, 30), new ItemOrder(3, "中村", "みかん", 70, 20), new ItemOrder(4, "村山", "リンゴ", 150, 10), new ItemOrder(5, "山大", "みかん", 70, 35), new ItemOrder(1, "大山", "リンゴ", 150, 2) ); DiffResult result = orders.get(0).diff(orders.get(5)); System.out.println(result); } }
ItemOrder
package jp.pjin.tech.java.domain; import java.io.Serializable; import org.apache.commons.lang3.builder.DiffBuilder; import org.apache.commons.lang3.builder.DiffResult; import org.apache.commons.lang3.builder.Diffable; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; public class ItemOrder implements Diffable<ItemOrder>, Serializable { private static final long serialVersionUID = 1L; private int id; private String client; private String item; private int price; private int order; private int amount; public ItemOrder(int id, String client, String item, int price, int order) { this.id = id; this.client = client; this.item = item; this.price = price; this.order = order; this.amount = price * order; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getClient() { return client; } public void setClient(String client) { this.client = client; } public String getItem() { return item; } public void setItem(String item) { this.item = item; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } @Override public DiffResult diff(ItemOrder obj) { return new DiffBuilder(this, obj, ToStringStyle.MULTI_LINE_STYLE) .append("id", this.id, obj.id) .append("client", this.client, obj.client) .append("item", this.item, obj.item) .append("price", this.price, obj.price) .append("order", this.order, obj.order) .append("amount", this.amount, obj.amount) .build(); } }
intだろうと、Stringだろうと2つの引数にいれることが出来て便利です。
項目名を入れないといけないところがつらいですが、アノテーションなどを利用すると汎用的なものが出来そうな気配がします。
この辺りは定義なので、しっかりプログラムを書くことが重要になる場合も多いです。
サンプルを実行すると、違い部分のみ出力されるのが分かると思います。
配列もあらかじめ用意しているので、少し数字をいじりながら、出力結果を見てください。