Рубрики
Без рубрики

Java 14 – Класс данных записи

Эта запись или класс данных является новой функцией Java 14, она обеспечивает компактный синтаксис для объявления классов. например, “точка записи (int x, int y)`

В этой статье представлена новая функция 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/”