Java 레코드 노트:작성자

15382 단어 Javatech
이것은 음반을 간단하게 조사하고 저장하는 시리즈다.
이번에는 코치님 얘기예요.

컨디션


$ 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에 구조기가 쓰여 있다.
아마 아래 느낌일 거예요.
  • 모든 구성 요소 필드의 매개 변수 목록을 초기화하는 데 사용되는 구조기를 canonical consutructor
  • 라고 하는 것 같습니다
  • canonical concetructor는 은근히 선포되었지만 명확하게 선포할 수도 있다
  • canonical concetructor를 명확히 선포할 때 예전과 같은 구조기와 소형 구조기 두 종류
  • 가 있었다.
  • 기본 구조기가 은밀하게 발표되지 않음
  • canonical concetructor가 아니라는 것을 설명할 수 있지만, 그 시작에서 canonical concetructor
  • 를 명확하게 호출해야 한다
    소형 구조기는 음반류의 간단한 명칭 뒤에 블록을 놓는 형식이다.
    public record Example(String text) {
        public Example { // コンパクトコンストラクター
            // ここで事前条件のチェックができる
            Objects.requireNonNull(text);
        }
    }
    
    소형 구조기는 포함되지 않은 것 같다return.
    Static InitializerInstance 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를 호출한 것이 맞습니다.
    그게 다야.

    좋은 웹페이지 즐겨찾기