Implementieren Sie die Klonmethode in Record, der zweiten Vorschau in Java 15, und aktivieren Sie Deep Copy.
Ich glaube nicht, dass es eine bestimmte Szene gibt, um dies zu verwenden, aber ich kann sie eines Tages verwenden, also werde ich sie als Memorandum verwenden.
Der Punkt ist, einen Klon mit dem Konstruktor zu erstellen, ohne super.clone ()
zu verwenden.
Java 15(Oracle Open JDK) IntelliJ IDEA Community-Version 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 weggelassen
}
NodeDto.java
public class NodeDto {
private String name;
// setter, getter,toString weggelassen
}
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 weggelassen
@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 weggelassen
@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'}}]
In 1-> 2 hat sich der Inhalt von Dto geändert, in 3-> 4 jedoch, da es sich um eine andere Instanz handelt, dto.setName (" dto3 ");
undnodeDto.setName ("node3");
Sie können sehen, dass es ohne Probleme nicht betroffen und geklont ist.
Recommended Posts