はじめに
BeanクラスのコピーをすることができるBeanUtilsクラスをSpringFrameworkが提供していることを知ったので、使ってみる。
Beanクラスのコピーをやってみる
BeanクラスのコピーはBeanUtilsクラスのcopyPropertiesメソッドを使用して行う。
第1パラメータにコピー元のクラスのオブジェクトを指定し、第2パラメータにコピー先のクラスのオブジェクトを指定する。
例の場合はProductクラスのオブジェクトの値をProductDtoクラスのオブジェクトに値をコピーすることができる。
Product product = new Product(1111,2222,"test",1000,"happy happy"); ProductDto dto = new ProductDto(); BeanUtils.copyProperties(product, dto);
Setter、Getterメソッドが必要
BeanUtilsクラスのcopyPropertiesメソッドを使用する場合、コピー元にはフィールドのGetterメソッド、コピー先にはフィールドのSetterメソッドが用意されていないと値がコピーされない。
Listのコピーは?
Beanクラスをコピーした後に、コピー元のListクラスのListクラスに要素を追加するとコピー先のListも更新された。
オブジェクトに関しては参照先がコピーされただけということがわかる。(シャローコピー)
最後に
BeanUtilsでBeanクラスのコピーメソッドが用意されていることは知らなかった。
他にも使えそうなユーティリティクラスがあるかもしれないので、SpringFrameworkのJavadocを見てみようと思う。
ただ、便利だからといって使い方を間違えるとバグにつながるので、内容を確認した上で使用しようと思う。
参考
import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import jp.sample.resttemplate.model.Product; import jp.sample.resttemplate.model.ProductDto; public class Main { private static Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("1"); Product product = new Product(1111,2222,"test",1000,"happy happy", list); ProductDto dto = new ProductDto(); BeanUtils.copyProperties(product, dto); logger.info("============================="); logger.info("product = {}", product.toString()); logger.info("dto = {}", dto.toString()); product.add("bb"); logger.info("============================="); logger.info("product = {}", product.toString()); logger.info("dto = {}", dto.toString()); } }
import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; @ToString @Getter @AllArgsConstructor @NoArgsConstructor public class Product { /** * 商品コード */ @JsonProperty("productCode") private int productCode = 0; /** * 仕入れ先コード */ @JsonProperty("supplierCode") private int supplierCode = 0; /** * 商品名 */ @JsonProperty("productName") private String name = null; /** * 価格 */ @JsonProperty("productPrice") private int price = 0; /** * メーカー */ @JsonProperty("maker") private String maker = null; private List<String> list; public void add(String a) { list.add(a); } }
import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @ToString @Setter @Getter @AllArgsConstructor @NoArgsConstructor public class ProductDto { /** * 商品コード */ @JsonProperty("productCode") private int productCode = 0; /** * 仕入れ先コード */ @JsonProperty("supplierCode") private int supplierCode = 0; /** * 商品名 */ @JsonProperty("productName") private String name = null; /** * 価格 */ @JsonProperty("productPrice") private int price = 0; /** * メーカー */ @JsonProperty("maker") private String maker = null; private List list; }