成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java原生支持Lombok了,你知道嗎?

開發 前端
Record類和record關鍵字的引入,極大地提升了定義類的便捷性,打破了Java語言規范中POJO類冗長的聲明。我們可以不用他,但是要知道其用法。就像是Java8的stream一樣,Record類也有很大魅力。

你好,我是看山。

我們在開發時會借助Lombok快速填充POJO類的模板方法,比如:getter、setter、equals、hashCode等,引入這個組件的原因是方便,一個注解就可以代理一堆的模板方法。

從Java16開始,我們可以借助Record類型實現相同的功能了,接下來,我們詳細看下這個類型。

Record是Java中的一種特殊類,旨在為程序員提供一種高效且簡便的方式實現POJO類。Record類型通過關鍵字record實現。

一、Java中的Record類是什么?

在Java項目開發中,作為開發者,我們常常編寫服務類、安全類或其他基礎類,這些類本質上是功能性的。同樣,程序員也經常編寫僅用于承載數據的類,即POJO類。

例如,假設客戶端向服務器請求某個人的“id”和“name”等數據,服務器會以相應的數據進行響應。

由于Java中一切皆為對象,所以必然存在某個類來承載這些數據,服務器會將該類的對象返回給客戶端,該對象的唯一目的就是將數據從服務器傳遞到客戶端。

然而,編寫這樣一個數據類,即便它可能只是一個簡單的POJO,也會包含大量的模板代碼,比如私有字段、構造函數、getter和setter方法、hashCode()、equals()和toString()方法。

由于Java語言的冗長特性,一個簡單的承載類會因大量不必要的代碼而變得臃腫。

這些弊端促使了一種特殊類型的類Record的誕生。該類能夠聚合(或持有)一組值,無需編寫自動生成樣板代碼,可以說是一種高效的數據對象構建方式。

雖然,即使沒有Record類型,我們也能寫好代碼,比如借助IDEA的模板生成,比如借助Lombok的注解,但是,原生支持的能力,在便利性和效率方面,可以給代碼注入新的靈魂。

我們看下以前的寫法:

import java.util.Objects;

public class Person {
    private int id;
    private String name;

    public Person() {}

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass()!= o.getClass()) return false;
        Person person = (Person) o;
        return getId() == person.getId() && getName().equals(person.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getId(), getName());
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

是不是看著都不想寫了。

二、如何在Java中創建Record類?

Java中的Record類由關鍵字record支持,語法為:

record recordName(list-of-components) {
    //可選語句
}

以record開頭,后面跟著類名和參數列表。此時,我們可以把前面的Person改寫為:

record Person(int id, String name){}

一下子就清爽了。

使用起來和原來沒有太多差異:

Person p1 = new Person(1, "Peter Parker");

在編譯過程中,編譯器會自動提供存儲數據所需的元素、構造函數、訪問數據的getter方法、toString()、equals()和hashCode()方法。因此,雖然沒有寫下面這些方法,也能夠正常使用。

Person p1 = new Person(1, "Peter Parker");
Person p2 = new Person(2, "Spiderman");
System.out.println(p1.toString());
System.out.println(p1.equals(p2));
System.out.println(p1.name());

關于上述代碼示例,有以下幾個要點需要注意:

  • Record類提供的規范構造函數包含與組件列表中傳遞的相同參數,且順序一致。傳遞的值會自動賦給記錄字段。
  • Record類通過“new”關鍵字進行實例化,就像在Java中創建其他任何對象一樣。
  • Record類中的數據保存在私有final字段中,并且只有getter方法。因此,記錄中的數據是不可變的。
  • Record類不能繼承其他類。是因為已經隱式繼承java.lang.Record。并重寫了Object類的equals()、hashCode()和toString()方法。
  • Record類聲明都是final的,所以它們不能被擴展。
  • Record類可以實現一個或多個接口。
  • 除了聲明的參數外,任何其他字段必須聲明為靜態的。

三、Java中的規范構造函數

在Record中,如果需要定義規范構造函數,需要按照預設格式定義。我們有兩種方式來聲明我們自己的實現。

方式一、常用的規范構造函數:

record Invoice(String id, float amount) {
    static String prefix = String.valueOf(Calendar.getInstance().get(Calendar.YEAR))
            + String.valueOf(Calendar.getInstance().get(Calendar.MONTH) + 1);

    public Invoice(String id, float amount) {
        this.id = prefix + id.trim();
        this.amount = amount;
    }
}

方式二、緊湊構造函數。在緊湊構造函數中,簽名聲明是隱式的。我們只需提供Record類名作為構造函數,不帶任何參數。這種類型的構造函數具有所有參數的隱式聲明,并且會自動將傳遞給記錄組件的值賦給相應參數。此外,在緊湊構造函數中,不使用this關鍵字。

record Invoice(String id, float amount) {
    static String prefix = String.valueOf(Calendar.getInstance().get(Calendar.YEAR))
            + String.valueOf(Calendar.getInstance().get(Calendar.MONTH) + 1);
    public Invoice {
        id = prefix + id.trim();
        amount = amount;
    }  
}

四、Java中的非規范構造函數

除了規范構造函數,我們還可以定義非規范構造函數。比如:當我們只想用默認初始化一個字段,此時,我們可以編寫一個非規范構造函數。

非規范構造函數的關鍵要求是,構造函數必須使用this關鍵字調用記錄中的另一個規范構造函數。

以下是一個簡單示例:

record Invoice(String id, float amount) {
    static String prefix = String.valueOf(Calendar.getInstance().get(Calendar.YEAR))
            + String.valueOf(Calendar.getInstance().get(Calendar.MONTH) + 1);
    public Invoice {
        id = prefix + id.trim();
        amount = amount;
    }

    public Invoice(String id) {
        this(id, 0.0f);
    }
}

非規范構造函數就像是預設默認值的一種實現。

五、Java Record類代碼示例

最后,我們來個示例代碼,展示了如何在Java中使用Record類、規范構造函數和非規范構造函數:

record Invoice(String id, float amount) {
    static String prefix = String.valueOf(Calendar.getInstance().get(Calendar.YEAR))
            + String.valueOf(Calendar.getInstance().get(Calendar.MONTH) + 1);
    public Invoice {
        id = prefix + id.trim();
        if (amount < 0)
            throw new IllegalArgumentException("-ve values not allowed");
        amount = amount;
    }

    public Invoice(String id) {
        this(id, 0.0f);
    }
}

public class App {
    public static void main(String[] args) {
        float[] amt = {400.00f, 600.00f, 300.00f, 700.00f, 600.00f};
        Invoice[] invoice = new Invoice[5];
        for (int i = 0; i < invoice.length; i++)
            invoice[i] = new Invoice(String.valueOf(i + 1), amt[i]);
        for (int i = 0; i < invoice.length; i++)
            System.out.println(invoice[i].toString());
    }
}

文末總結

Record類和record關鍵字的引入,極大地提升了定義類的便捷性,打破了Java語言規范中POJO類冗長的聲明。我們可以不用他,但是要知道其用法。就像是Java8的stream一樣,Record類也有很大魅力。

責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2024-04-07 00:00:03

2019-06-06 15:00:25

手機iPhone摩托羅拉

2024-10-12 08:01:53

2024-10-09 08:54:31

2018-12-27 08:50:06

JavaScript開源

2021-10-08 11:13:41

子集問題數據結構算法

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量

2023-12-20 08:23:53

NIO組件非阻塞

2023-12-12 08:41:01

2023-04-26 10:21:04

2024-04-30 09:02:48

2020-02-20 08:30:49

OSPF網絡協議路由協議

2021-04-20 23:16:06

SparkSQL語法

2022-12-02 14:12:52

新能源汽車海爾

2024-07-08 00:00:01

多線程ThreadC#

2025-02-18 08:11:17

2024-09-18 07:00:00

消息隊列中間件消息隊列

2022-11-04 14:16:05

2023-03-21 07:39:51

CentOS掛載硬盤
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美区在线 | 免费观看一级特黄欧美大片 | 中文字幕免费视频 | 密色视频 | 自拍在线| 免费在线看黄视频 | 成人在线观看免费视频 | 欧美精品在线一区二区三区 | 国产91视频免费 | 欧美bondage紧缚视频 | 99热首页| 国产二区三区 | 欧美色999 | 精品久久久久久亚洲精品 | 91精品在线看 | 本道综合精品 | 91视视频在线观看入口直接观看 | 欧洲精品一区 | 综合色在线| 国产91丝袜在线播放 | 日韩一区二区三区四区五区 | 99精品欧美一区二区蜜桃免费 | 精品国产免费一区二区三区演员表 | 青青草一区二区 | 久久中文一区二区 | 亚洲在线一区二区 | 精品久久香蕉国产线看观看亚洲 | 美女国内精品自产拍在线播放 | 久久99精品久久久水蜜桃 | 天天躁天天操 | 欧美福利网站 | 看羞羞视频 | 国产精品一区二区不卡 | 国产成人精品久久久 | 欧美专区在线 | 欧美一区二区三区在线视频 | av免费观看在线 | 日韩免费1区二区电影 | av一二三区 | 日本在线精品视频 | 欧美天堂 |