Tips

Java apache commons DiffBuilder サンプルプログラム

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つの引数にいれることが出来て便利です。
項目名を入れないといけないところがつらいですが、アノテーションなどを利用すると汎用的なものが出来そうな気配がします。
この辺りは定義なので、しっかりプログラムを書くことが重要になる場合も多いです。

サンプルを実行すると、違い部分のみ出力されるのが分かると思います。
配列もあらかじめ用意しているので、少し数字をいじりながら、出力結果を見てください。

java apache commons

Java apache commons StrSubstitutor サンプルプログラム

StrSubstitutorの説明(google翻訳) 文字列内の変数を値で置き換えます。 このクラスはテキストを取り込み、その中のすべての変数を代入します。変数のデフォルト定義は$ {variableName}です。プレフィックスと接尾辞はコンストラクタとメソッドを使って変更できます。 変数値は、
java apache commons

Java apache commons StrMatcher サンプルプログラム

StrMatcherの説明(google翻訳) 文字配列部分が一致するかどうかを調べるために照会できるmatcherクラス。 このクラスには、さまざまなファクトリメソッドが用意されています。これらが十分でない場合は、独自のマッチャーをサブクラス化して実装できます。 シングルクォートやダブルクォート、
java apache commons

Java apache commons StrLookup サンプルプログラム

StrLookupの説明(google翻訳) 文字列キーを文字列値にルックアップします。 このクラスは、最も簡単な形式の文字列から文字列へのマップを表します。それは、キーに基づいてオンデマンドで結果を作成できるという点で、マップよりも利点があります。 このクラスには、さまざまなファクトリメソッドが用
java apache commons

Java apache commons StrBuilder サンプルプログラム

StrBuilderの説明(google翻訳) StringBufferよりも柔軟で強力なAPIを提供する構成部分から文字列を作成します。 StringBuffer / StringBuilderとの主な相違点は次のとおりです。 同期されていない 最終的ではない サブクラスは文字配列に直接アクセスで
java apache commons

Java apache commons ExtendedMessageFormat サンプルプログラム

ExtendedMessageFormatの説明(google翻訳) java.text.MessageFormatを拡張し、埋め込みフォーマット要素のプラグイン可能/追加の書式設定オプションを許可します。クライアントコードは、String形式名に関連付けられたFormatFactoryインスタンス
java apache commons

Java apache commons MethodUtils サンプルプログラム

MethodUtilsの説明(google翻訳) もともとコモンズBeanUtilsのメソッドに焦点を当てたユーティリティリフレクションメソッド。 BeanUtilsのバージョンとの違いは、特にLang内にすでに存在する機能が類似している場合には、注意が必要です。 既知の制限事項 デフォルトアクセス
java apache commons

Java apache commons InheritanceUtils サンプルプログラム

InheritanceUtilsの説明(google翻訳) 継承に焦点を当てたユーティリティメソッド。 継承階層を取得するためのユーティリティーです。 インターフェースは含まれず、extendsされているものだけの階層数を返すメソッドのみがあります。 継承関係がなければ、-1を返します。 Inher
java apache commons

Java apache commons FieldUtils サンプルプログラム

FieldUtilsの説明(google翻訳) リフレクションによるフィールドとの作業のためのユーティリティ。休止状態のCommonsサンドボックスコンポーネントから適応され、リファクタリングされました。 プログラマーによってコード化された有効範囲制限を解除する機能が提供されています。これにより、フ
java apache commons

Java apache commons ConstructorUtils サンプルプログラム

ConstructorUtilsの説明(google翻訳) MethodUtilsの後にモデル化されたコンストラクタに焦点を当てたユーティリティリフレクションメソッド。 既知の制限事項 デフォルトアクセススーパークラスでのパブリックコンストラクタへのアクセス デフォルトのアクセススーパークラスに含ま
java apache commons

Java apache commons ToStringBuilder サンプルプログラム

ToStringBuilderの説明(google翻訳) Object.toString()メソッドの実装を支援します。 このクラスを使用すると、任意のクラスまたはオブジェクトに対して良好で一貫したtoString()を構築できます。このクラスは、次の方法でプロセスを簡素化することを目的としています

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search