常規(guī)的轉換方式:
a.setId(b.getId());
a.setUserName(b.getName());
當類中的成員變量非常多,幾十個,這種方式就會變得非常糟糕,且易出錯,不易排查,
有沒有更好的方式來解決這個問題呢?
可以試試lombok項目,利用建造者模式來做,使用方式是添加@Builder
也是谷歌代碼規(guī)范推薦方式:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* Created by echo on 2018/8/17.
*/
@Builder
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
private String address;
public static void main(String[] args) {
User user = User.builder().name("echo").age(28).address("China").build();
System.out.println(user);
}
}
User(name=echo, age=28, address=China)
Process finished with exit code 0
屬性少的話,直接set即可。
如果屬性多的話,可以考慮使用Apache中的Bean工具包,主要使用 BeanUtils.copyProperties(Object dest,Object orig) 和 PropertyUtils.copyProperties(Object dest,Object orig),原理無非是反射讀取到屬性列表,然后循環(huán)賦值,主要注意的只拷貝dest和orig的相同的名稱的字段,比如orig有一個userName屬性,dest有一個userName屬性,則orig的userName會賦值到dest的userName上。
我看你的給你的例子name賦值到userName這種情況,上面的工具就不適用了,我們簡單做一個轉化,上面的工具類可以適用。請看例子:
public class Original{
private Integer id;
private String name;
private String desc;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Original [id=" + id + ", name=" + name + ", desc=" + desc + "]";
}
}
public class Dest{
private Integer id;
private String userName;
private String desc;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Dest [id=" + id + ", userName=" + userName + ", desc=" + desc
+ "]";
}
}
import org.apache.commons.beanutils.PropertyUtils;
public class Test {
public static void main(String[] args) throws Exception {
Original o = new Original();
o.setId(7);
o.setName("七夕快樂");
o.setDesc("老婆給我最好的七夕禮物是給我獨處的一天");
Dest d = new Dest();
PropertyUtils.copyProperties(d, o);
System.out.println(d);//Dest [id=7, userName=null, desc=老婆給我最好的七夕禮物是給我獨處的一天]
}
}
由于d中userName屬性和original中的name屬性名稱不一致,工具也知道怎么映射,這個時候我們在dest類中添加一個public void setName(String userName){this.userName = userName;}方法,
然后打印下就正確了。[id=7, userName=七夕快樂, desc=老婆給我最好的七夕禮物是給我獨處的一天]
一般bean直接的拷貝,都是有很多屬性名稱相同的,稍微幾個不同,用上面的方法即可,如果有很多的屬性名不同,那可以自己寫一個工具類,實現(xiàn)映射配置。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。