java bean 物件屬性複製框架BeanMapping-release_0.0.2-註解支援

葉止水發表於2019-02-25

BeanMapping

為了更加靈活的指定對映方式,0.0.2 版本引入了 @BeanMapping 註解。

註解的定義

註解定義在 bean-mapping-api 模組中,bean-mapping-core 會預設引入此模組。

package com.github.houbb.bean.mapping.api.annotation;

import com.github.houbb.bean.mapping.api.core.ICondition;
import com.github.houbb.bean.mapping.api.core.IConvert;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <p> BeanMapping 註解 </p>
 *
 * <pre> Created: 2019/2/19 10:11 PM  </pre>
 * <pre> Project: bean-mapping  </pre>
 *
 * @author houbinbin
 * @since 0.1.0
 */
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanMapping {

    /**
     * 欄位的名稱
     * 如果不填,則預設使用欄位的名稱
     * 1. 會將 source 的值賦值給 target 和當前 name 屬性一致的物件。
     * @return 名稱
     */
    String name() default "";

    /**
     * 生效條件
     * 1. 預設為生效
     * 2. 當放在 source 欄位上時,表示是否將值賦給 target 欄位
     * 當放在 target 欄位上時,表示是否接受賦值。
     * 3. source+target只有同時生效時,才會發生賦值。
     * @return 具體的生效實現
     */
    Class<? extends ICondition> condition() default ICondition.class;

    /**
     * 型別轉換
     * 1. 預設不進行轉換
     * 2. 為了確保轉換的確定性+靈活性。物件中指定這個屬性,不會改變物件的屬性值和型別。
     * 如果要改變原來的值,那麼型別就會被限制的很多,無法足夠的靈活。
     * 3. 只有當 source 的值轉換後可以設定給 target,才會將 source 轉換後的值賦值給 target 對應屬性,其他情況不會對值產生影響。
     * @return 具體的轉換實現
     */
    Class<? extends IConvert> convert() default IConvert.class;

}
複製程式碼

name 屬性

有時候 source 和 target 的欄位名稱可能不同,只需要通過這個屬性,讓二者保持一致即可。

ICondition 介面

用於指定賦值是否生效,可以實現目標物件有值就不被覆蓋的常見需求。

public interface ICondition {

    /**
     * 將原始資訊轉換為目標資訊
     * @param context 當前執行上下文
     * @return 轉換結果
     */
    boolean condition(final IContext context);

}
複製程式碼

IContext 上下文介面

其中 IContext 是執行的上下文,便於獲取到執行的相關屬性。更加靈活的指定和實現我們的功能。

IConvert 欄位轉化介面

有時候我們希望對欄位的值進行處理,比如日期/金額格式化,列舉值顯示的處理等等。

就可以藉助這個介面,保證程式碼賦值的優雅性,提升程式碼的可複用性,更加符合 Open-Close 原則。

/**
 * <p> 轉換介面 </p>
 * 1. 所有的實現都應該提供預設構造器
 * <pre> Created: 2019/2/19 10:15 PM  </pre>
 * <pre> Project: bean-mapping  </pre>
 *
 * @param <T> 目標泛型
 * @author houbinbin
 * @since 0.1.0
 */
public interface IConvert<T> {

    /**
     * 將原始資訊轉換為目標資訊
     * @param context 當前執行上下文
     * @return 轉換結果
     */
    T convert(final IContext context);

}
複製程式碼

擴充閱讀

屬性複製框架-01-不同名稱欄位的指定賦值

屬性複製框架-02-自定義賦值生效的條件

屬性複製框架-03-自定義欄位轉換實現

相關文章