Recentemente, as empresas precisam copiar objetos, mas eu não quero obter e definir um por um, então encontrei três métodos para copiar objetos online.
Uma cópia rasa.
1. A classe que precisa ser copiada implementa a interface Cloneable;
2. Sobrescreve o método clone ();
import java.lang.Cloneable ;;
classe pública OrderVO implementa Cloneable {
private int orderID;
private int userID;
private double orderAmount;
public int getOrderID() {
return orderID;
}
public void setOrderID(int orderID) {
this.orderID = orderID;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public double getOrderAmount() {
return orderAmount;
}
public void setOrderAmount(double orderAmount) {
this.orderAmount = orderAmount;
}
@Override
public Object clone() {
OrderVO vo = null;
try {
vo = (OrderVO) this.clone();
} catch (Exception e) {
e.printStackTrace();
}
return vo;
}
}
Segunda cópia em profundidade.
Na cópia superficial, apenas variáveis-membro do tipo value, para tipos de referência, copiam o endereço do objeto de referência para o objeto clone, ou seja, as variáveis-membro do objeto protótipo e do objeto clone apontam para o mesmo endereço de memória. Dessa maneira, o valor de referência do objeto copiado é modificado, e o valor do objeto original também será alterado, o que está obviamente errado.
Existem duas soluções: uma é definir o tipo de referência da variável para o objeto clone; a segunda é implementar diretamente a serialização, executar operações de E / S no objeto e ler / gravar. Pode-se imaginar que esse método é mais problemático.
Terceiro, a classe de ferramenta BeanUtils e PropertyUtils para replicação de objetos
Se é para implementar o método clone () ou operação de E / S, é mais problemático e o código é demais.Neste momento, você pode usar a classe de ferramenta java para obtê-lo em uma linha.
A principal diferença entre o BeanUtils e o PropertyUtils é que o BeanUtils fornece a função de conversão de tipos, ou seja, quando se descobre que dois JavaBeans com o mesmo atributo de nome são tipos diferentes, a conversão é realizada dentro do intervalo de tipos de dados suportados, mas o PropertyUtils não suporta essa função. Como não é suportado, a velocidade será mais rápida. No desenvolvimento real, o BeanUtils é mais comumente usado e o risco de cometer erros é menor.
OrderVO vo1 = new OrderVO(); // 原对象
OrderVO vo2 = new OrderVO(); // 目标对象
try {
BeanUtils.copyProperties(vo2, vo1);
} catch (Exception e) {
e.printStackTrace();
}
Observe que se você deseja copiar objetos em um loop, não deve gravar a instrução do novo novo objeto fora do loop, caso contrário, cada novo valor será um endereço de referência.