2017-06-20 87 views
0
提供BeanUtils.copyProperties一個Builder

我想一個POJO對象的屬性複製到另一個不可變對象的生成器,像這樣:複製性能與春天

public class CopyTest { 

    // the source object 
    public static class Pojo1 { 
     private int value; 

     public int getValue() { 
      return value; 
     } 

     public void setValue(int value) { 
      this.value = value; 
     } 
    } 

    // the target object 
    public static class Pojo2 { 
     private final int value; 

     public Pojo2(int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 

     public static Pojo2Builder builder() { 
      return new Pojo2Builder(); 
     } 

     // builder of the target object, maybe generated by lombok 
     public static class Pojo2Builder { 
      private int value; 

      private Pojo2Builder() {} 

      public Pojo2Builder value(int value) { 
       this.value = value; 
       return this; 
      } 

      public Pojo2 build() { 
       return new Pojo2(value); 
      } 
     } 
    } 

    public static void main(String[] args) { 

     Pojo1 src = new Pojo1(); 
     src.setValue(1); 

     Pojo2.Pojo2Builder builder = Pojo2.builder(); 

     // this won't work, provided by spring-beans 
     BeanUtils.copyProperties(src, builder); 

     Pojo2 target = builder.build(); 
    } 

} 

的問題是: BeanUtils.copyProperties()spring-beans提供不會撥打Pojo2Builder.value(int),因爲它不是setter;

除了生成器類通常是由lombok生成所以無法命名方法Pojo2Builder.value(int)作爲Pojo2Builder.setValue(int)

順便說一句,我已經做了它使用註冊一個定製的BeanIntrospector由阿帕奇百科全書提供commons-beanutilsBeanUtilsBean.copyProperties(),但我發現使用commons-beanutils複製性能比使用spring-beans當拷貝中的兩個不同之間發生的貴得多類,所以我更喜歡做這個使用spring-beans

所以是有可能的屬性複製到生成器類與Spring或其他一些公用事業這比commons-beanutils更有效率?

回答

0

您不僅需要更改方法名稱,而且還需要將其返回類型更改爲void(對於構建器而言非常愚蠢)。添加@Setter註釋會有所幫助,if it was allowed

如果您需要將值複製到同一班級的構建器中,則可以使用Lombok的toBuilder()。或者使用@Wither直接創建對象。

如果你需要堅持使用bean的約定,那麼你可能運氣不好。考慮使用mapstruct,這應該更靈活。

1

如果構建器不遵循bean約定,那麼它不會使用bean實用程序。

請更改構建器或編寫自己的複製實用程序。