Implémentez la méthode de clonage sur Record, qui est le deuxième aperçu de Java 15, et activez la copie complète.
Je ne pense pas qu'il y ait une scène particulière pour l'utiliser, mais je peux l'utiliser un jour, alors je vais l'utiliser comme un mémorandum.
Le but est de faire un clone avec le constructeur sans utiliser super.clone ()
.
Java 15(Oracle Open JDK) Version de la communauté IntelliJ IDEA Windows
ExampleRecord.java
public record ExampleRecord(String name, int age, ExampleDto dto) {
}
ExampleDto.java
public class ExampleDto {
private String name;
private int age;
private NodeDto node;
// setter, getter,toString omis
}
NodeDto.java
public class NodeDto {
private String name;
// setter, getter,toString omis
}
ExampleRecord.java
public record ExampleRecord(String name, int age, ExampleDto dto) {
@Override
public ExampleRecord clone() {
try {
return new ExampleRecord(this.name, this.age, this.dto.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
ExampleDto.java
public class ExampleDto implements Cloneable {
private String name;
private int age;
private NodeDto node;
// setter, getter,toString omis
@Override
public ExampleDto clone() throws CloneNotSupportedException {
ExampleDto copy = (ExampleDto) super.clone();
copy.node = this.node.clone();
return copy;
}
}
NodeDto.java
public class NodeDto implements Cloneable {
private String name;
// setter, getter,toString omis
@Override
public NodeDto clone() throws CloneNotSupportedException {
return (NodeDto) super.clone();
}
}
Main.java
public class Main {
public static void main(String[] args) {
ExampleDto dto = new ExampleDto();
NodeDto nodeDto = new NodeDto();
nodeDto.setName("node1");
dto.setNode(nodeDto);
dto.setName("dto1");
dto.setAge(1);
ExampleRecord exampleRecord = new ExampleRecord("record1", 2, dto);
System.out.println("exampleRecord:"+exampleRecord);// 1
dto.setName("dto2");
nodeDto.setName("node2");
System.out.println("exampleRecord:"+exampleRecord);// 2
ExampleRecord clone = exampleRecord.clone();
System.out.println("clone:"+clone);// 3
dto.setName("dto3");
nodeDto.setName("node3");
System.out.println("clone:"+clone);// 4
}
}
1.
exampleRecord:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto1', age=1, node=NodeDto{name='node1'}}]
2.
exampleRecord:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
3.
clone:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
4.
clone:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
En 1-> 2, le contenu de Dto a changé, mais en 3-> 4, c'est une instance différente, donc dto.setName (" dto3 "); ʻand
nodeDto.setName (" node3 ");` Vous pouvez voir qu'il n'est pas affecté et cloné sans aucun problème.
Recommended Posts