How to use maru-dogデータバインドライブラリ (1)

maru-dogデータバインドライブラリはインスタンス間でプロパティのデータのコピーを行うライブラリです。

apache-commonsのBeanUtilsによく似ていますが、アノテーションによるバインド制御や、複数のJavaBeansインスタンスのプロパティの値を1つの結果オブジェクトに集約することができる等、より柔軟な制御を行うことが可能です。

それでは最もシンプルなサンプルを例に解説します。

import org.maru.dog.Director;
import org.maru.dog.Marudog;
import org.maru.dog.annotation.Bind;
import org.maru.dog.annotation.Bound;

public class Main {

    public static void main(String[] args) {
        Director director = Marudog.getDirector();

        UserMaster master = getUserMaster();

        UserProfile profile = getUserProfile();
        UserBean user = new UserBean();

        director.bind(user, master, profile);
        System.out.println(user);
    }

    private static UserMaster getUserMaster() {
        UserMaster master = new UserMaster();
        master.userId = "ABC123";
        master.password = "PASSWORD";
        return master;
    }

    private static UserProfile getUserProfile() {
        UserProfile profile = new UserProfile();
        profile.address = "Tokyo/Japan";
        profile.age = 25;
        profile.gender = 1;
        profile.userName = "Maru dog";
        return profile;
    }

    static class UserBean {
        @Bound
        private String userId;

        @Bound
        private String userName;

        @Bound
        String address;

        @Bound
        private short age;

        @Bound
        private byte gender;

        @Override
        public String toString() {
            return "UserBean [userId=" + userId + ", userName=" + userName
                    + ", address=" + address + ", age=" + age + ", gender="
                    + gender + "]";
        }

    }

    static class UserMaster{
        @Bind
        private String userId;

        private String password;
    }

    static class UserProfile {
        @Bind
        private String userName;

        @Bind
        String address;

        @Bind
        private short age;

        // 1:man, 2:woman
        @Bind
        private byte gender;
    }

}

上記プログラムの実行結果は以下のようになります。

UserBean [userId=ABC123, userName=Maru dog, address=Tokyo/Japan, age=25, gender=1]

まずバインド先のUserBeanクラスのフィールドに@Boundというアノテーションが付与されています。このアノテーションをMarudogが読み取りバインド先の情報を構築します。

次にバインド元となるUserMaster、UserProfileクラスに@Bindというアノテーションが付与されています。このアノテーションを読み取り、Marudogはバインド元の情報を構築します。

mainメソッドの中でMarudog.getDirector()でDirectorオブジェクトを取得しています。このDirectorオブジェクトがバインドの制御を管理するクラスです。director.bind(user, master, profile)でuserクラスの@Bound付与されたフィールドにmasterとprofileの@Bindが付与されたフィールドの値がバインド(コピー)されます。

Director#bindメソッド内ではString型の名前解決を行いバインド対象を決定します。@Bind、@Boundはそれぞれname属性を持っていますが、ここでは何も指定していないためデフォルトでフィールド名がバインドを行う際の名前解決に用いられます。
Directorにはbind以外に次のようなメソッドを持っています。

Director#getInstance(Class targetClass, K... inputs)
Director#getInstance(T target, K... inputs)
Director#bindByFieldName(T target, K... inputs)

2つのgetInstanceメソッドの違いは第一引数がClass型のメソッドの場合はそのクラスのインスタンスを生成してバインドを行い結果を返します。もう一方のメソッドは単純に第一引数で受け取ったインスタンスにバインドを行いそのインスタンスを返します。
bindByFieldNameはフィールド名による名前解決を行いバインドを実行します。当該メソッドを用いる場合@Bind、@Boundアノテーションは必要ありません。

詳細な利用方法は次の機会に解説したいと思います。

プロジェクトサイト:http://maru.sourceforge.jp/index.html
ドキュメント:http://maru.sourceforge.jp/document_dog.html