рдореБрд╕реАрдмрдд
рдЬрд╛рд╡рд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рдФрд░ рдорд╛рдирдХ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИред
рдЖрдЗрдП рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд┐рд▓реНрд▓реА рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦреЗрдВред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рд▓реНрд▓реА рд╡рд╕реНрддреБ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг (рдХреНрд╖реЗрддреНрд░) рд╣реЛрдВ:
- рдирд╛рдо
- рдЬреАрд╡рди рдХреА рд╕рдВрдЦреНрдпрд╛
- рд░рдВрдЧ
рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдЕрдм рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп) рдмрдирд╛рддреЗ рд╣реИрдВ - рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдЕрдкрдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред
public final class Cat {
private final String name;
private final int numberOfLives;
private final String color;
public Cat(String name, int numberOfLives, String color) {
this.name = name;
this.numberOfLives = numberOfLives;
this.color = color;
}
public String getName() {
return name;
}
public int getNumberOfLives() {
return numberOfLives;
}
public String getColor() {
return color;
}
}
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рд╣реИ рдирд╛?
. equals() hashCode().
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cat cat = (Cat) o;
return numberOfLives == cat.numberOfLives &&
Objects.equals(name, cat.name) &&
Objects.equals(color, cat.color);
}
@Override
public int hashCode() {
return Objects.hash(name, numberOfLives, color);
}
? , toString():
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", numberOfLives=" + numberOfLives +
", color='" + color + '\'' +
'}';
}
. ! ( IDE ) . , (, ) .
, :
private final String name;
private final int numberOfLives;
private final String color;
тАФ , . IDE , , Lombok, .
Java , , Cat. тАФ , , equals(), hashCode() toString(). , , . тАФ , . . , hashCode() equals()?
Records
Java 14 , Record, JEP 359: Records (Preview).
50 , :
public record Cat(String name, int numberOfLives, String color) { }
, ?
, тАФ :
- equals(), hashCode() toString()
, .
public final class Cat extends java.lang.Record {
private final java.lang.String name;
private final int numberOfLives;
private final java.lang.String color;
public Cat(java.lang.String name, int numberOfLives, java.lang.String color) { }
public java.lang.String toString() { }
public final int hashCode() { }
public final boolean equals(java.lang.Object o) { }
public java.lang.String name() { }
public int numberOfLives() { }
public java.lang.String color() { }
}
, Cat. , , тАФ getColor() color().
java.lang.Record.
equals() , . toString() :
Cat[name=Fluffy, numberOfLives=9, color=White]
, , .
, .
, . , , , . :
public record Cat(String name, int numberOfLives, String color) {
public boolean isAlive() {
return numberOfLives >= 0;
}
}
.
(Custom)
, . , Cat :
Cat cat = new Cat("Fluffy", 9, "White");
, тАФ , .
, , 9. , , 9 . , .
public record Cat(String name, int numberOfLives, String color) {
public Cat(String name, String color) {
this(name, 9, color);
}
}
. . , . , , :
public record Cat(String name, int numberOfLives, String color) {
public Cat(String name,int numberOfLives, String color) {
if(numberOfLives < 0) {
throw new IllegalArgumentException("Number of lives cannot be less than 0.");
}
if(numberOfLives > 9) {
throw new IllegalArgumentException("Cats cannot have that many lives.");
}
this.name = name;
this.numberOfLives = numberOfLives;
this.color = color;
}
}
, ( ), . , .
public record Cat(String name, int numberOfLives, String color) {
public Cat {
}
}
java.lang.Class , , .
isRecord(). , , - :
Cat cat = new Cat("Fluffy", 9, "White");
if(cat.getClass().isRecord()) {
}
getRecordComponents(). , . java.lang.reflect.RecordComponent. , , :
!
, , Java 14 ( 2/2020).
Preview feature ( )
(Records) Java 14. . ?
VM тАФ Java SE, , , . JDK ; , Java SE.
JDK , , Java SE , , . , ( ), ( ), .
JDK, . . , , , .
, JDK 14.
IntelliJ IDEA
IntelliJ IDEA Preview feature File тЖТ Project Structure.

IntelliJ IDEA рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 2020.1 рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред 2/2020 рддрдХ, рдпрд╣ рдЕрд░реНрд▓реА рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд┐рд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ IDEA рдХреЗ рдкрд╛рд╕ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдиреБрдЕрд▓ рд╕рдВрдХрд▓рди
рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ javac рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
javac --release 14 --enable-preview ...
рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╣реИред рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдмрд╕ --enable- рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ
java --enable-preview ...
рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ
рдорд╛рд╡реЗрди рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>14</release>
<compilerArgs>
--enable-preview
</compilerArgs>
```14</source>
<target>14</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
</plugins>
</build>