代码先锋网 代码片段及技术文章聚合

Java 14 –记录数据类

记录数据类示例

本文介绍了JEP 359中定义的Java 14新功能–记录或数据类。

PS此record数据类是预览功能

为什么要记录?
Java太冗长,如果要声明一个class,则需要创建许多繁琐且重复的方法,例如构造函数,访问器, equals()hashCode()toString() 最后,Java 14引入了record类,以通过自动创建所有繁琐的方法来简化过程。

record数据类。

Point.java
public record Point(int x, int y){};

1.反编译Java 14记录类。

尝试反编译上面的Point.class ,我们将获得以下源代码。

想法反编译类
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 record将自动生成以下变量和方法。

  • 最后的类扩展了java.lang.Record
  • 私有最终实例变量。
  • 构造函数,(以实例变量作为参数)
  • toString()
  • hashCode()equals() ,用于对象比较。
  • 实例变量的getter()无setter的所有最终变量。

记录数据类示例

很好,它为我们节省了在IDE中的几次单击。

2.如何使用Java 14 Record?

本示例向您展示如何使用record类。

Point.java
public record Point(int x, int y){};
PointApp.java
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]

    }

}

输出量

Terminal
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开发人员的生活现在非常简单simple

3.覆盖默认的Record方法。

3.1查看Location记录类,我们将覆盖默认记录的构造函数和toString()

Location.java
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测试。

LocationApp.java
package com.mkyong.java14.jep359;

public class LocationApp {

  public static void main(String[] args) {

      Location loc = new Location(10, 20);
      System.out.println(loc);

  }
}

输出量

Terminal
GPS Location{latitude=30.0, longitude=60.0}

4.记录可序列化吗?

我们可以将record类读取或写入文件吗? 答案是肯定的,它使record类实现了Serializable并且可以工作。

Java14FileApp.java
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;
    }

}

输出量

Terminal
GPS[latitude=10.0, longitude=20.0]

5.预览语言功能

5.1该record类是预览功能。 我们需要使用--enable-preview选项来手动启用它。

$ javac --enable-preview --release 14 Point.java

$ java --enable-preview Point

5.2对于IntelliJ IDE,请更新到最新版本2020.1.1;否则,请重新安装。 它应该支持Java 14的新预览功能。

Idea Java 14预览功能

下载源代码

参考文献

From: https://mkyong.com/java/java-14-record-data-class/

版权声明:本文为cyan20115原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cyan20115/article/details/106540882

智能推荐

LeetCode 刷题记录(14)—Java语言

14. 最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: [“flower”,”flow”,”flight”] 输出: “fl” 示例 2: 输入: [“dog”,&rdquo...

Java14新特性-记录类型

Java14这个新特性感觉可以替代Lombok的部分功能,他主要用于java的轻量级类,有点类似于Scala语言中的case类,Kotlin语言中的数据类和c#中的recod类。可以为我们省去setter/getter方法,还有其它的一些特性。 下面给出Person类实例 我们把name,age,address当成是Person的组件 现在让我们先看一个编译后的class文件是什么样的: 通过编译...

【01-14】java ThreadLocal工具类

自定义ThreadLocal 操作ThreadLocal的工具类 更一般的工具类...

java多线程(14)ThreadLocal类

ThreadLocal类对象可以为每一个线程都建立一个“副本”,使得好像每一个线程都“拥有了”ThreadLocal类对象一样 以下为代码示例,具体的讲解穿插在代码中  ...

Java API(14)之Date/DateFormat类

Date类 l  Date类概述 •    类Date 表示特定的瞬间,精确到毫秒。 l  构造方法 •    public Date() •    public Date(long date) l  成员方法 &bul...

猜你喜欢

JAVA 14

Static 如果一个成员变量使用了static关键字,那么这个对象不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。多个对象共享同一份数据。 一旦使用static修饰成员方法,那这就成为了静态方法。静态方法不属于对象,而是属于类。 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用。 如果有static关键字,可以直接通过类名称调用。 无论是静态变量还是静态方法,都...

Java大数据实习随笔14

实习记录第十四天 第一,CSS(层叠样式表)框架的使用。在显示数据库时,字体的颜色设置,原本是通过font标签设置的,将会重复使用该标签,不符合程序的优化原则。因此,创建一个css文件,方便颜色或字体的调用。关于颜色或字体的设置的优先级,设置在一行中的最先执行,设置在页面中的次之,最后则是css文件中的设置。 第二,bootstrap的使用。将bootstrap文件夹导入IDEA中web文件夹下,...

大数据学习-Java Day14

大数据学习-Java Day14 集合类库 1 泛型机制 基本概念 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做Object类型放入的,因此 从集合中取出元素时也是Object类型,为了表达该元素真实的数据类型,则需要强制类型转换, 而强制类型转换可能会引发类型转换异常。 为了避免上述错误的发生,从Java5开始增加泛型机制,也就是在集合名称的右侧使用<数据类型> 的...

java 面试 潜力_Java 14记录中的真正潜力

java 面试 潜力 Of all of the features introduced in Java 14, perhaps the one that has generated the most excitement is Records. 在Java 14中引入的所有功能中, Records也许是最令人兴奋的功能。 Developers have long lamented the nee...

JavaScript面向对象简介

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#JavaScript_Object_Oriented_Programming avaScript 的核心是支持面向对象的,同时它也提供了强大灵活的 OOP 语言能力。本文从对面向对象编程的介绍开始,带您...