在Java中,将一个对象的数据赋值到另一个新建对象中通常称为对象复制或克隆,有以下几种常见实现方式:
1. 手动赋值(推荐)
最直接的方式是手动创建新对象,并逐个属性赋值:
public class User {
private String name;
private int age;
// 构造方法、Getter和Setter省略
// 复制方法
public User copy() {
User newUser = new User();
newUser.setName(this.name);
newUser.setAge(this.age);
return newUser;
}
}
// 使用示例
User original = new User("Alice", 30);
User copy = original.copy();
2. 实现Cloneable接口(浅克隆)
通过实现Cloneable
接口并重写clone()
方法:
public class User implements Cloneable {
private String name;
private int age;
@Override
protected User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
// 使用示例
User original = new User("Bob", 25);
User copy = original.clone(); // 需要处理异常
注意:
Cloneable
是标记接口,需重写clone()
方法。- 浅克隆:仅复制对象本身,引用类型字段仍指向原对象。
- 深克隆:需手动递归复制所有引用类型字段。
3. 构造函数复制
在目标类中添加带参构造函数:
public class User {
private String name;
private int age;
// 复制构造函数
public User(User other) {
this.name = other.name;
this.age = other.age;
}
}
// 使用示例
User original = new User("Charlie", 35);
User copy = new User(original);
4. 使用BeanUtils(Apache Commons)
通过工具类自动复制属性:
import org.apache.commons.beanutils.BeanUtils;
User original = new User("David", 40);
User copy = new User();
BeanUtils.copyProperties(copy, original);
依赖:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
5. 使用ModelMapper(推荐)
更灵活的对象映射工具:
import org.modelmapper.ModelMapper;
User original = new User("Eve", 28);
ModelMapper modelMapper = new ModelMapper();
User copy = modelMapper.map(original, User.class);
依赖:
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.1.0</version>
</dependency>
选择建议
- 简单对象:手动赋值或构造函数复制。
- 复杂对象:使用ModelMapper或BeanUtils。
- 需要深克隆:手动实现或结合序列化(如JSON)。
示例(手动深克隆):
public class Address {
private String city;
// getter/setter
}
public class User {
private String name;
private Address address;
public User copy() {
User newUser = new User();
newUser.setName(this.name);
// 深克隆:手动复制引用类型
Address newAddress = new Address();
newAddress.setCity(this.address.getCity());
newUser.setAddress(newAddress);
return newUser;
}
}