рдЬрд╛рд╡рд╛ 14 рд░рд┐рдХреЙрд░реНрдб рдХреА рдЦреЛрдЬ

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдмреЗрд╣рддрд░ instanceof рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЗ рдЖрдЧрд╛рдореА, 14 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдорд╛рд░реНрдЪ 2020 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЖрдЬ рдореИрдВ рджреВрд╕рд░реА рд╕рд┐рдВрдереИрдЯрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЬрд╛рд╡рд╛ 14: рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред

рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХрд╛ рдЕрдкрдирд╛ JEP рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЦреБрдж рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рд╣рд╛рдВ, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рдПрд╕рдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕реАрдЧрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЖрд░рд╛рдо рд╕реЗ рдмреИрдареЗрдВред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрдм рдореБрдЭреЗ Instof рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ JDK рд╢рд╛рдЦрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдерд╛, рдЕрдм рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ JDK 14 рдмрд┐рд▓реНрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдерд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Point рд╕рд╛рде рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 record Point(float x, float y) { } 

 > javac --enable-preview --release 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. 

javac рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ Point.class рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХреАред рдЖрдЗрдП рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВ:

 > javap -private Point.class Compiled from "Point.java" final class Point extends java.lang.Record { private final float x; private final float y; public Point(float, float); public java.lang.String toString(); public final int hashCode(); public final boolean equals(java.lang.Object); public float x(); public float y(); } 

рд╣рд╛рдБ, рд╕рдВрдХрд▓рдХ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рдпрд╛:

  • рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ java.lang.Record рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ ( enum рд╕рдорд╛рди, рдЬреЛ java.lang.Enum рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ)ред
  • рдирд┐рдЬреА рдЕрдВрддрд┐рдо рдлрд╝реАрд▓реНрдб x рдФрд░ y ред
  • рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЬреЛ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рд╣рд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред
  • toString() , hashCode() рдФрд░ equals() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, hashCode() рдФрд░ equals() final , рдФрд░ toString() рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреБрдЫ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдЦреБрдж final , рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛? (рдореИрдВ рдирд╣реАрдВ)
  • рдлрд╝реАрд▓реНрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗред

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ toString() , hashCode() рдФрд░ equals() рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -verbose рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде javap рдЪрд▓рд╛рдПрдВ:

рд▓рдВрдмреЗ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рдкрд┐рди
 > javap -private -verbose Point.class Classfile Point.class Last modified 29 . 2019 .; size 1157 bytes SHA-256 checksum 24fe5489a6a01a7232f45bd7739a961c30d7f6e24400a3e3df2ec026cc94c0eb Compiled from "Point.java" final class Point extends java.lang.Record minor version: 65535 major version: 58 flags: (0x0030) ACC_FINAL, ACC_SUPER this_class: #8 // Point super_class: #2 // java/lang/Record interfaces: 0, fields: 2, methods: 6, attributes: 4 Constant pool: #1 = Methodref #2.#3 // java/lang/Record."<init>":()V #2 = Class #4 // java/lang/Record #3 = NameAndType #5:#6 // "<init>":()V #4 = Utf8 java/lang/Record #5 = Utf8 <init> #6 = Utf8 ()V #7 = Fieldref #8.#9 // Point.x:F #8 = Class #10 // Point #9 = NameAndType #11:#12 // x:F #10 = Utf8 Point #11 = Utf8 x #12 = Utf8 F #13 = Fieldref #8.#14 // Point.y:F #14 = NameAndType #15:#12 // y:F #15 = Utf8 y #16 = Fieldref #8.#9 // Point.x:F #17 = Fieldref #8.#14 // Point.y:F #18 = InvokeDynamic #0:#19 // #0:toString:(LPoint;)Ljava/lang/String; #19 = NameAndType #20:#21 // toString:(LPoint;)Ljava/lang/String; #20 = Utf8 toString #21 = Utf8 (LPoint;)Ljava/lang/String; #22 = InvokeDynamic #0:#23 // #0:hashCode:(LPoint;)I #23 = NameAndType #24:#25 // hashCode:(LPoint;)I #24 = Utf8 hashCode #25 = Utf8 (LPoint;)I #26 = InvokeDynamic #0:#27 // #0:equals:(LPoint;Ljava/lang/Object;)Z #27 = NameAndType #28:#29 // equals:(LPoint;Ljava/lang/Object;)Z #28 = Utf8 equals #29 = Utf8 (LPoint;Ljava/lang/Object;)Z #30 = Utf8 (FF)V #31 = Utf8 Code #32 = Utf8 LineNumberTable #33 = Utf8 MethodParameters #34 = Utf8 ()Ljava/lang/String; #35 = Utf8 ()I #36 = Utf8 (Ljava/lang/Object;)Z #37 = Utf8 ()F #38 = Utf8 SourceFile #39 = Utf8 Point.java #40 = Utf8 Record #41 = Utf8 BootstrapMethods #42 = MethodHandle 6:#43 // REF_invokeStatic java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; #43 = Methodref #44.#45 // java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; #44 = Class #46 // java/lang/runtime/ObjectMethods #45 = NameAndType #47:#48 // bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; #46 = Utf8 java/lang/runtime/ObjectMethods #47 = Utf8 bootstrap #48 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; #49 = String #50 // x;y #50 = Utf8 x;y #51 = MethodHandle 1:#7 // REF_getField Point.x:F #52 = MethodHandle 1:#13 // REF_getField Point.y:F #53 = Utf8 InnerClasses #54 = Class #55 // java/lang/invoke/MethodHandles$Lookup #55 = Utf8 java/lang/invoke/MethodHandles$Lookup #56 = Class #57 // java/lang/invoke/MethodHandles #57 = Utf8 java/lang/invoke/MethodHandles #58 = Utf8 Lookup { private final float x; descriptor: F flags: (0x0012) ACC_PRIVATE, ACC_FINAL private final float y; descriptor: F flags: (0x0012) ACC_PRIVATE, ACC_FINAL public Point(float, float); descriptor: (FF)V flags: (0x0001) ACC_PUBLIC Code: stack=2, locals=3, args_size=3 0: aload_0 1: invokespecial #1 // Method java/lang/Record."<init>":()V 4: aload_0 5: fload_1 6: putfield #7 // Field x:F 9: aload_0 10: fload_2 11: putfield #13 // Field y:F 14: return LineNumberTable: line 1: 0 MethodParameters: Name Flags x y public java.lang.String toString(); descriptor: ()Ljava/lang/String; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokedynamic #18, 0 // InvokeDynamic #0:toString:(LPoint;)Ljava/lang/String; 6: areturn LineNumberTable: line 1: 0 public final int hashCode(); descriptor: ()I flags: (0x0011) ACC_PUBLIC, ACC_FINAL Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokedynamic #22, 0 // InvokeDynamic #0:hashCode:(LPoint;)I 6: ireturn LineNumberTable: line 1: 0 public final boolean equals(java.lang.Object); descriptor: (Ljava/lang/Object;)Z flags: (0x0011) ACC_PUBLIC, ACC_FINAL Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: invokedynamic #26, 0 // InvokeDynamic #0:equals:(LPoint;Ljava/lang/Object;)Z 7: ireturn LineNumberTable: line 1: 0 public float x(); descriptor: ()F flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #16 // Field x:F 4: freturn LineNumberTable: line 1: 0 public float y(); descriptor: ()F flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #17 // Field y:F 4: freturn LineNumberTable: line 1: 0 } SourceFile: "Point.java" Record: float x; descriptor: F float y; descriptor: F BootstrapMethods: 0: #42 REF_invokeStatic java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; Method arguments: #8 Point #49 x;y #51 REF_getField Point.x:F #52 REF_getField Point.y:F InnerClasses: public static final #58= #54 of #56; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles 

invokedynamic toString() , hashCode() рдФрд░ invokedynamic equals() рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣рдо invokedynamic рджреЗрдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рддрд░реАрдХреЛрдВ рдХрд╛ рд▓реЙрдЬрд┐рдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рд╣реА рдирд┐рд░реНрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдПрдХ рдорд╣рд╛рди рд░рдирдЯрд╛рдЗрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡реЗ рдХреБрдЫ рддреЗрдЬ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдкреБрд░рд╛рдиреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдорд┐рд▓реЗрдВрдЧреЗред рдпрд╣ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рднреА рдХрдо рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдо рдмрд╣реБрдд рдЧрд╣рд░реЗ рдЧрдПред рдЖрдЗрдП рдЕрдкрдиреЗ рднреЗрдбрд╝ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЖрдЗрдП рдПрдХ Point рдХреЛ рдкрд▓рдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рддрд░реАрдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╕реЗ, рдореИрдВ рдЕрдм javac рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдмрд╕ рд╕реАрдзреЗ java рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдКрдВрдЧрд╛:

 тАж public class Main { public static void main(String[] args) { var point = new Point(1, 2); System.out.println(point); System.out.println("hashCode = " + point.hashCode()); System.out.println("hashCode2 = " + Objects.hash(point.x(), point.y())); var point2 = new Point(1, 2); System.out.println(point.equals(point2)); } } record Point(float x, float y) { } 

 > java --enable-preview --source 14 Main.java Note: Main.java uses preview language features. Note: Recompile with -Xlint:preview for details. Point[x=1.0, y=2.0] hashCode = -260046848 hashCode2 = -260045887 true 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ , toString() рдФрд░ equals() рддрдм рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЬрдм рддрдХ рдХрд┐ toString() рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛)ред рд▓реЗрдХрд┐рди hashCode() рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ Objects.hash() рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рд╣рдореЗрдВ hashCode() рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣рдо main() рд╡рд┐рдзрд┐ рдХреЛ рдЕрдВрджрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:

 тАж public record Point(float x, float y) { @Override public int hashCode() { return Objects.hash(x, y); } public static void main(String[] args) { System.out.println(new Point(1, 2).hashCode()); } } 

 > java --enable-preview --source 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. -260045887 

рдареАрдХ рд╣реИред рдЕрдм рдЪрд▓реЛ рд╕реНрдерд╛рдпрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЪрд▓реЛ рдХреБрдЫ рдЧрд▓рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:

 public record Point(float x, float y) { private float z; } 

 Point.java:2: error: field declaration must be static private float z; ^ (consider replacing field with record component) 

рддреЛ, рдЖрдк рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдШрдЯрдХреЛрдВ рдХреЛ final рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╡реЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЕрдВрддрд┐рдо рд╣реЛрдВрдЧреЗ?

 public record Point(final float x, final float y) { } 

 Point.java:1: error: record components cannot have modifiers public record Point(final float x, final float y) { ^ Point.java:1: error: record components cannot have modifiers public record Point(final float x, final float y) { ^ 

рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИред рддрд╛рдХрд┐ рдпрд╣ рднреНрд░рдо рди рд░рд╣реЗ рдХрд┐ рдЕрдВрддрд┐рдо рдирд┐рдХрд╛рд▓ рджреЗрдиреЗ рдкрд░ рдШрдЯрдХ рдЖрдкрд╕ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рдПрдВрдЧреЗред рд╣рд╛рдВ, рдФрд░ enum рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рдирд┐рдпрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ:

 enum A { final X; // No modifiers allowed for enum constants } 

рдпрджрд┐ рдЖрдк рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

 public record Point(float x, float y) { public double x() { return x; } } 

 Point.java:2: error: invalid accessor method in record Point public double x() { ^ (return type of accessor method x() is not compatible with type of record component x) 

рдпрд╣ рдмрд┐рд▓рдХреБрд▓ рддрд╛рд░реНрдХрд┐рдХ рд╣реИред

рдФрд░ рдЕрдЧрд░ рдЖрдк рджреГрд╢реНрдпрддрд╛ рдмрджрд▓рддреЗ рд╣реИрдВ?

 public record Point(float x, float y) { private float x() { return x; } } 

 Point.java:2: error: invalid accessor method in record Point private float x() { ^ (accessor method must be public) 

рдпрд╣ рдЕрд╕рдВрднрд╡ рднреА рд╣реИред

Object рд╕реЗ рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд┐рд╖рд┐рджреНрдз рд╣реИ:

 public record Point(float x, float y) extends Object { } 

 Point.java:1: error: '{' expected public record Point(float x, float y) extends Object { ^ 

рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 public record Point(float x, float y) implements PointLike { public static void main(String[] args) { PointLike point = new Point(1, 2); System.out.println(point.x()); System.out.println(point.y()); } } public interface PointLike { float x(); float y(); } 

 > java --enable-preview --source 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. 1.0 2.0 

рд╡рд┐рд╣рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдХреИрдиреЛрдирд┐рдХрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд┐рдЦреЗрдВ, рдЕрд░реНрдерд╛рддреНред рддрд░реНрдХ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд╣рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдФрд░ рд╡рд╣рд╛рдВ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдорд╛рдиреНрдпрддрд╛ рдЬреЛрдбрд╝реЗрдВ:

 public record Point(float x, float y) { public Point { if (Float.isNaN(x) || Float.isNaN(y)) { throw new IllegalArgumentException("NaN"); } } public static void main(String[] args) { System.out.println(new Point(Float.NaN, 2)); } } 

 тАж Exception in thread "main" java.lang.IllegalArgumentException: NaN at Point.<init>(Point.java:4) at Point.main(Point.java:9) 

рдпрд╣ рдЕрд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдПрдХ рд╣реА рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди return :

 public record Point(float x, float y) { public Point { if (!Float.isNaN(x) && !Float.isNaN(y)) { return; } throw new IllegalArgumentException("NaN"); } } 

 Point.java:2: error: invalid compact constructor in record Point(float,float) public Point { ^ (compact constructor must not have return statements) 

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдгред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЬреАрд╡рди рдореЗрдВ рдмрд╣реБрдд рдиреБрдХрд╕рд╛рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд▓реЗрдЦрди return рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдЖрдИрдбреАрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЗрдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╣рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

 public record Point(float x, float y) { public Point(float _x, float _y) { if (Float.isNaN(_x) || Float.isNaN(_y)) { throw new IllegalArgumentException("NaN"); } this.x = _x; this.y = _y; } } 

 Point.java:2: error: invalid canonical constructor in record Point public Point(float _x, float _y) { ^ (invalid parameter names in canonical constructor) 

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдХреЛрдб рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛ред

рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдСрд░реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

 public record Point(float x, float y) { public Point { System.out.println(this); } public static void main(String[] args) { System.out.println(new Point(-1, 2)); } } 

 тАж Point[x=0.0, y=0.0] Point[x=-1.0, y=2.0] 

рдлрд░реНрд╕реНрдЯ Point рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ Point , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ System.out.println(this) рдмрд╛рдж рдЦреЗрддреЛрдВ рдХреЛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред System.out.println(this) ред

рд╕рдм рдареАрдХ рд╣реИред рдЧреИрд░-рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рддрд░реНрдХ рдХреЗ рдПрдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛:

 public record Point(float x, float y) { public Point() { } } 

 Point.java:2: error: constructor is not canonical, so its first statement must invoke another constructor public Point() { ^ 

рд╣рд╛рдБ, this(0, 0) рд▓рд┐рдЦрдирд╛ рднреВрд▓ рдЧрдП this(0, 0) ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

 public record Point<A extends Number>(A x, A y) { public static void main(String[] args) { System.out.println(new Point<>(-1, 2)); } } 

 > java --enable-preview --source 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. Point[x=-1, y=2] 

рдХреБрдЫ рднреА рдЕрд▓реМрдХрд┐рдХ рдирд╣реАрдВред рдареАрдХ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

 public record None() { public static void main(String[] args) { System.out.println(new None()); } } 

 > java --enable-preview --source 14 None.java Note: None.java uses preview language features. Note: Recompile with -Xlint:preview for details. None[] 

рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рд╣рдордиреЗ рдХрд┐рди рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ? рдиреЗрд╕реНрдЯреЗрдб рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

 record Point(int x, int y) { record Nested(int z) { void print() { System.out.println(x); } } } 

 Point.java:4: error: non-static record component x cannot be referenced from a static context System.out.println(x); ^ 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣рдореЗрд╢рд╛ рд╕реНрдерд┐рд░ рд╣реЛрддреА рд╣реИрдВ (рдЬреИрд╕реЗ enum )ред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рд░рд┐рдХреЙрд░реНрдб рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рддрдм рдЗрд╕реЗ рдмрд╛рд╣рд░реА рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 public class Main { public static void main(String[] args) { record Point(int x, int y) { void print() { System.out.println(Arrays.toString(args)); } } new Point(1, 2).print(); } } 

 > java --enable-preview --source 14 Main.java Note: Main.java uses preview language features. Note: Recompile with -Xlint:preview for details. [] 

рд╣рдореНрдо, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред рдпрд╛ рдмрд╕ рдПрдХ рджреЛрд╖: рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рдиреАрдп рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдмрд╛рд╣рд░реА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдирд╛ рднреВрд▓ рдЧрдПред

рдПрдХ рд╡реНрдпрдерд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ: рдХреНрдпрд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

 public record Point(float x, float y) { } public record Point2(float x, float y) { } 

 > javac --enable-preview --release 14 Point.java Point.java:4: error: class Point2 is public, should be declared in a file named Point2.java public record Point2(float x, float y) { ^ 

рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдЕрдкрдиреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдХреЙрд░реНрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЛ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╕рдВрд▓рдЧреНрди рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХрд┐рд╕реА рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреИрд╕реЗ? рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк Class.getRecordCompords () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import java.lang.reflect.RecordComponent; public record Point(float x, float y) { public static void main(String[] args) { var point = new Point(1, 2); for (RecordComponent component : point.getClass().getRecordComponents()) { System.out.println(component); } } } 

 > java --enable-preview --source 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. float x float y 

рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдЬрд╛рд╡рд╛ 14 рдореЗрдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛: ElementType.RECORD_COMPONENT ред рдФрд░ рдпрджрд┐ рдЖрдк рдкреБрд░рд╛рдиреЗ рдкреНрд░рдХрд╛рд░ FIELD рдФрд░ PARAMETER рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЖрдЦрд┐рд░рдХрд╛рд░, рдШрдЯрдХ рди рддреЛ рдХреНрд╖реЗрддреНрд░ рдФрд░ рди рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ:

 public record Point( @FieldAnnotation @ComponentAnnotation float x, @ParamAnnotation @ComponentAnnotation float y) { } @Target(ElementType.FIELD) @interface FieldAnnotation { } @Target(ElementType.PARAMETER) @interface ParamAnnotation { } @Target(ElementType.RECORD_COMPONENT) @interface ComponentAnnotation { } 

рд╣рд╛рдБ, рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреАрдиреЛрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЦреИрд░, рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдЦреЗрддреЛрдВ рдореЗрдВ "рдШрд╕реАрдЯреЗ" рдЬрд╛рдПрдВрдЧреЗ?

 public record Point( @FieldAnnotation @ComponentAnnotation float x, @ParamAnnotation @ComponentAnnotation float y) { public static void main(String[] args) { var point = new Point(1, 2); Field[] fields = point.getClass().getDeclaredFields(); for (Field field : fields) { for (Annotation annotation : field.getAnnotations()) { System.out.println(field + ": " + annotation); } } } } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface FieldAnnotation { } @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @interface ParamAnnotation { } @Target(ElementType.RECORD_COMPONENT) @Retention(RetentionPolicy.RUNTIME) @interface ComponentAnnotation { } 

 > java --enable-preview --source 14 Point.java Note: Point.java uses preview language features. Note: Recompile with -Xlint:preview for details. private final float Point.x: @FieldAnnotation() 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ FIELD рдПрдиреЛрдЯреЗрд╢рди "рдШрд╕реАрдЯрд╛" рд╣реИрдВ, рд▓реЗрдХрд┐рди RECORD_COMPONENT рдФрд░ PARAMETER ред

рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╣реА рдмреЛрдЭрд┐рд▓ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ "рдЦреБрджрд╛рдИ" рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рд╢рд╛рдВрдд рдФрд░ рдмрд╣реБрдд рд╣реА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдордп рдмрдЪрд╛рдПрдЧреА рдФрд░ рд╣рдореЗрдВ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдмрдЪрд╛рдПрдЧрд╛ред рдЕрдм рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдЦреБрд░рджрд░реЗрдкрди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЬрд╛рд╡рд╛ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ, рддрдм рдЖрдкрдХреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ 1-2 рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЙрдирдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ред

рдФрд░ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ 8 рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд┐рддрдВрдмрд░ 2021 рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рддреБрд░рдВрдд рдЬрд╛рд╡рд╛ 17 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╕реНрд╡рд┐рдЪ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА, рдкрд╛рда рдХреЗ рдмреНрд▓реЙрдХ , рдмреЗрд╣рддрд░ рдЗрдВрд╕реНрдЯреЛрдлрд╝ , рд░рд┐рдХреЙрд░реНрдб рдФрд░ рд╕реАрд▓ рдкреНрд░рдХрд╛рд░ (рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде)ред

PS рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рд▓реЗрдЦреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдореЗрд░реЗ рдЪреИрдирд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред

рдЖрдиреЗ рдХреЗ рд╕рд╛рде рд╕рднреА!

Source: https://habr.com/ru/post/hi482300/


All Articles