網頁

2014年2月13日 星期四

Commons Beanutils使用copyProperties()

當bean有很多的field,要複製到另一個bean時,大量的getter/setter代碼,會增加了代碼長度和閱讀難度,而Apache Commons Beanutils提供了copyProperties()來處理大量的field,1個很常見的情況就是Struts中的的bean和對應的ActionForm複製。




先前Mix已經實作了2個bean,Magazine與Book,這次要將Magazine的所有field值copy到Book中,不用傳統的方式,單1個field取值,再依序設定,而是用copyProperties()來處理。

Magazine

package org.openyu.java.commons.beanutils;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * The Class Magazine.
 */
public class Magazine {

 /** The id. */
 private long id;

 /** The name. */
 private String name;

 /** The price. */
 private int price;

 /** The author. */
 private Author author;

...
}



Book

package org.openyu.java.commons.lang;

import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * The Class Book.
 */
// 支援比較
public class Book implements Comparable {

 /** The id. */
 private long id;

 /** The name. */
 private String name;
...
}






 @Test
 public void copyProperties() throws Exception {
  Magazine magazine = new Magazine();
  magazine.setId(1L);
  magazine.setName("OpenYu");
  magazine.setPrice(1000);
  //
  Author author = new Author();
  author.setId(1L);
  author.setName("Java");
  magazine.setAuthor(author);
  //
  Book book = new Book();
  BeanUtils.copyProperties(book, magazine);

  System.out.println(magazine);
  System.out.println(book);

  assertEquals(magazine.getId(), book.getId());
  assertEquals(magazine.getName(), book.getName());
 }



Mix利用copyProperties(),很快的就完成2個物件中field的複製,代碼也精簡了許多,不會有一大堆getter/setter的method充斥其中。



console查看其結果。

Magazine[id=1,name=OpenYu,author=org.openyu.java.commons.beanutils.Author@68e6ff0d[id=1,name=Java]]
Book[id=1,name=OpenYu]








沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...