В этой статье представлена новая функция Java 14 – запись или класс данных, определенный в JEP 359 .
P.S Этот запись класс данных – это функция предварительного просмотра
Зачем записывать? Java слишком многословен, если мы хотим объявить класс,
нам нужно создать множество утомительных и повторяющихся методов, таких как конструкторы, средства доступа, equals()
, Хэш-код ()
, toString()
. Наконец, Java 14 представила класс record
, чтобы упростить процесс, автоматически создавая все утомительные методы.
A запись
класс данных.
public record Point(int x, int y){};
1. Декомпилируйте класс записей Java 14.
Попробуйте декомпилировать вышеизложенное Point.class
, и мы получим следующий исходный код.
// IntelliJ API Decompiler stub source generated from a class file // Implementation of methods is not available package com.mkyong.java14.jep359; public final class Point extends java.lang.Record { private final int x; private final int y; public Point(int x, int y) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int x() { /* compiled code */ } public int y() { /* compiled code */ } }
Java 14 запись
автоматически создаст следующие переменные и методы.
- конечный класс расширяется
java.lang. Запись
. - частные переменные конечного экземпляра.
- конструкторы (с переменными экземпляра в качестве аргументов)
Строка()
Хэш-код()
иравно()
, для сравнения объектов.геттер()
для переменной экземпляра, нет установщиков , все конечные переменные.
Это хорошо, и это сэкономило нам несколько кликов в IDE.
2. Как использовать запись Java 14?
В этом примере показано, как использовать класс запись
.
public record Point(int x, int y){};
package com.mkyong.java14.jep359; public class PointApp { public static void main(String[] args) { // constructor Point(int x, int y) Point p1 = new Point(10, 20); // getters int x() System.out.println(p1.x()); // 10 // getters int y() System.out.println(p1.y()); // 20 Point p2 = new Point(11, 22); System.out.println(p2.x()); // 11 System.out.println(p2.y()); // 22 Point p3 = new Point(10, 20); System.out.println(p3.x()); // 10 System.out.println(p3.y()); // 20 // hashCode and equals System.out.println(p1.hashCode()); // 330 System.out.println(p2.hashCode()); // 363 System.out.println(p3.hashCode()); // 330 System.out.println(p1.equals(p2)); // false System.out.println(p1.equals(p3)); // true System.out.println(p1.equals(p1)); // true // toString() System.out.println(p1); // Point[x=10, y=20] System.out.println(p2); // Point[x=11, y=22] System.out.println(p3); // Point[x=10, y=20] } }
Выход
10 20 11 22 10 20 330 363 330 false true true Point[x=10, y=20] Point[x=11, y=22] Point[x=10, y=20]
Жизнь Java-разработчика теперь намного проще 🙂
3. Переопределите методы записи по умолчанию.
3.1 Просмотрите класс записи Местоположение
, мы переопределим конструктор записи по умолчанию и toString()
.
package com.mkyong.java14.jep359; public record Location(double latitude, double longitude) { // override record default constructor public Location { this.latitude = latitude * 3; this.longitude = longitude * 3; } // override record toString @Override public String toString() { return "GPS Location{" + "latitude=" + latitude + ", longitude=" + longitude + '}'; } }
3.2 Проверьте это.
package com.mkyong.java14.jep359; public class LocationApp { public static void main(String[] args) { Location loc = new Location(10, 20); System.out.println(loc); } }
Выход
GPS Location{latitude=30.0, longitude=60.0}
4. Является Ли Запись Сериализуемой?
Можем ли мы прочитать или записать класс запись
в файл? Ответ – да, делает запись
реализует класс Сериализуемым
и это работает.
package com.mkyong.java14.jep359; import java.io.*; record GPS(double latitude, double longitude) implements Serializable { }; public class Java14FileApp { private static final String FILE_PATH = "location.obj"; public static void main(String[] args) { GPS obj = new GPS(10, 20); save(obj, FILE_PATH); GPS result = read(FILE_PATH); System.out.println(result); } private static void save(GPS obj, String path) { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path))) { oos.writeObject(obj); } catch (IOException e) { e.printStackTrace(); } } private static GPS read(String path) { GPS result = null; try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))) { result = (GPS) ois.readObject(); } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); } return result; } }
Выход
GPS[latitude=10.0, longitude=20.0]
5. Функция предварительного просмотра Языка
5.1 Этот запись
класс является функцией предварительного просмотра. Нам нужно использовать опцию --enable-предварительный просмотр
, чтобы включить ее вручную.
$ javac --enable-preview --release 14 Point.java $ java --enable-preview Point
5.2 Для IDE IntelliJ, пожалуйста, обновите до последней версии 2020.1.1; она должна поддерживать новые функции предварительного просмотра Java 14.
Скачать Исходный Код
$клон git $клон git
$компакт-диск java-14
Рекомендации
- Что нового в Java 14
- JEP 359
- Примеры сериализации Java
Оригинал: “https://mkyong.com/java/java-14-record-data-class/”