在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java實體類轉換有沒有更優(yōu)雅的方式?

java實體類轉換有沒有更優(yōu)雅的方式?

常規(guī)的轉換方式:

a.setId(b.getId());
a.setUserName(b.getName());

當類中的成員變量非常多,幾十個,這種方式就會變得非常糟糕,且易出錯,不易排查,
有沒有更好的方式來解決這個問題呢?

回答
編輯回答
不二心

a.initFromB(b)?

2017年11月2日 15:12
編輯回答
莫小染

BeanUtils:
public static void copyProperties(java.lang.Object dest, java.lang.Object orig) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException;

其中 dest是目標,orig是最初的
Spring的工具類

2017年7月3日 03:23
編輯回答
我甘愿

你可以試試Bean拷貝,但是最傳統(tǒng)的方法速度是最快的

2018年9月5日 03:19
編輯回答
拮據(jù)

可以試試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
2017年9月10日 01:00
編輯回答
絯孑氣

屬性少的話,直接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)映射配置。

2017年8月7日 03:52
編輯回答
離人歸

這個問題我也想知道、大概最優(yōu)雅的方式最好是點下鼠標右鍵,然后點個復制就好了,樓主其實可以自己寫個idea的插件來滿足這個需求。開發(fā)插件也不難,幾個小時就可以搞定入門到一個簡單功能,以后就可以偷懶了。/偷笑

2018年6月26日 01:33