Java 레코드 노트:작성자
이번에는 코치님 얘기예요.
컨디션
$ java --version
java 17 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)
구조기의 개요
언어규범8.10.4. Record Constructor Declarations에 구조기가 쓰여 있다.
아마 아래 느낌일 거예요.
소형 구조기는 음반류의 간단한 명칭 뒤에 블록을 놓는 형식이다.
public record Example(String text) {
public Example { // コンパクトコンストラクター
// ここで事前条件のチェックができる
Objects.requireNonNull(text);
}
}
소형 구조기는 포함되지 않은 것 같다return
.Static Initializer와Instance Initializer와 같다.
참고로 음반은 Instance Initializer를 쓸 수 없습니다.
엄숙하다
양식에 쓰인 다음 문장에 매우 신경을 쓰다.
The serialization mechanism treats instances of a record class differently than ordinary serializable or externalizable objects. In particular, a record object is deserialized using the canonical constructor (§8.10.4).
일반적으로 대상이 분류될 때 구조기가 호출되지 않지만, 음반은 canonical concetructor로 호출되는 것 같습니다.
아래 코드로 확인했어요.
package example.record;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class RecordDeserializeDemo {
record Rec(String text) implements Serializable {
public Rec {
System.out.println("Recのcanonical constructorが呼び出されました。text = " + text);
}
}
// 比較のため通常のクラスも用意する
static final class Obj implements Serializable {
private final String text;
public Obj(String text) {
System.out.println("Objのコンストラクターが呼び出されました。text = " + text);
this.text = text;
}
public String text() {
return text;
}
}
public static void main(String[] args) throws Exception {
Rec rec1 = new Rec("demo");
System.out.println("rec1.text = " + rec1.text());
Obj obj1 = new Obj("demo");
System.out.println("obj1.text = " + obj1.text());
System.out.println("シリアライズします");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(rec1);
out.writeObject(obj1);
out.flush();
out.close();
System.out.println("デシリアライズします");
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
Rec rec2 = (Rec) in.readObject();
System.out.println("rec2.text = " + rec2.text());
Obj obj2 = (Obj) in.readObject();
System.out.println("obj2.text = " + obj2.text());
}
}
출력은 다음과 같다.Recのcanonical constructorが呼び出されました。text = demo
rec1.text = demo
Objのコンストラクターが呼び出されました。text = demo
obj1.text = demo
シリアライズします
デシリアライズします
Recのcanonical constructorが呼び出されました。text = demo
rec2.text = demo
obj2.text = demo
desiriation에서 canonical constructor를 호출한 것이 맞습니다.그게 다야.
Reference
이 문제에 관하여(Java 레코드 노트:작성자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/backpaper0/articles/8f9145a4ade4fc46c695텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)