日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

背景

隨之JAVA 21正式發布。該版本是繼JDK 17之后最新的長期支持版本(LTS),將獲得至少8年的支持!而SpringBoot3和Spring6的最低依賴就是JDK17了。

在JAVA8的時代,開發者肯定都使用過Lombok庫,這個庫大大提升了我們的開發效率,少寫了很多代碼,但是它也存在很多問題,下面我來細細聊一下。

首先我們看下傳統意義上的定義一個類:

public class User {
    private String userName;
    private String emAIl;
    private int userId;

    public User(String username, String email, int userId) {
        this.userName = userName;
        this.email = email;
        this.userId = userId;
    }

    public String getUserName() {
        return username;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (userId != user.userId) return false;
        if (username != null ? !username.equals(user.userName) : user.userName != null) return false;
        return email != null ? email.equals(user.email) : user.email == null;
    }

    @Override
    public int hashCode() {
        int result = userName != null ? userName.hashCode() : 0;
        result = 31 * result + (email != null ? email.hashCode() : 0);
        result = 31 * result + userId;
        return result;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + ''' +
                ", email='" + email + ''' +
                ", userId=" + userId +
                '}';
    }
}

而使用Lombok后的代碼:

import lombok.Data;

@Data
public class User {
    private String userName;
    private String email;
    private int userId;
}

@Data注解會自動生成所有的getter函數、字段的所有setter函數、toString函數、構造函數、hashCode和equals函數。

@Data 注釋結合了其他幾個 Lombok 注釋,例如 @Getter、@Setter、@EqualsAndHashCode 和 @toString。如果需要,我們還可以單獨使用這些注釋。

看上去是很美好,不是嗎?但是仔細思考下,會發現這些問題:

  1. 第三方依賴:Lombok是一個第三方庫,作為開發人員,我們依賴第三方庫來完成這些瑣碎的事情。Lombok僅依靠社區支持來維護。如果隨著Java 版本的升級可能會存在不兼容性問題或者該庫不受支持,則會導致代碼庫出現問題。
  2. IDE 兼容性: Lombok 依賴于編譯時的代碼生成,這可能并不總是與所有集成開發環境 (IDE) 無縫協作。某些 IDE 可能不完全支持 Lombok 功能,從而導致難以識別和理解生成的代碼。

那么有什么好的替代方案嗎?Record了解一下?

什么是Record

Record是 Java 中從 Java 14(作為預覽功能)開始引入的新功能,并在Java 16中正式引入。Records提供了一種簡潔的方法來定義主要用于封裝數據的簡單類。它們是一種類,可以根據類的字段自動生成常用方法,例如構造函數、 equals()、hashCode()和。toString()

你看到 Record 和 Lombok 之間的相似之處了嗎?他們都在幫助我們實現同樣的目標。

那么如何使用呢?

要使用 Record 定義上述 User 類,我們只需要這樣做。

public record UserRecord(String userName, String email, int userId) {
}

就是這樣。只需一行代碼即可實現我們用 65 行傳統編碼和 5 行 Lombok 所做的事情。另外,我們不必依賴第三方庫。

一旦我們創建了上面的類,除了toString、hashCode和equals等類級別的方法之外,Java內部還定義了三個final變量及其getter方法。

讓我們詳細討論Record

一旦我們有了用戶Record類,我們就可以開始使用它了。

// Initialize the record.
UserRecord userRecord = new UserRecord("test", "[email protected]", 1234);
// get the properties
System.out.println(userRecord.email());
System.out.println(userRecord.toString());

請注意,getter 方法中沒有“get”關鍵字。我們需要直接使用變量名作為方法名。例如,getEmail()我們不是像傳統上那樣使用,而是在調用 Record 方法時使用email()。

一旦初始化,我們就無法設置 Record 的屬性值。所有變量都是最終的。這意味著記錄是不可變的

我們可以在記錄中定義實例和類函數。我們可以定義靜態變量。我們不能定義實例變量。

   // 類(靜態)變量
  public static final String invalidEmailMessage = "INVALID EMAIL";

  // 實例變量 - 不允許。會拋出錯誤。
  public String defaultEmail = "[email protected]";

  // 類函數
  public static void sayMyName() {
    System.out.println("zhangsan");
  }

  // 實例函數
  public String emailDomain() {
    return this.email.split("@")[1];
  }
// 使用對象
userRecord.emailDomain();
// 使用 Class 調用靜態方法。
UserRecord.sayMyName();

Record類無法擴展。所有 Record 類都隱式擴展 Record 類。而且Java不允許多重繼承。因此我們的 Record 類不能是任何其他類的子類。

默認情況下,記錄也是最終記錄。因此我們不能將它們用作任何其他類的父類。

記錄構造器

該記錄聲明了一個帶有所有參數的默認構造函數。這種類型的構造函數稱為規范構造函數

public UserRecord(String username, String email, int userId) {
    this.username = username;
    this.email = email;
    this.userId = userId;
  }

我們可以在構造函數中編寫自定義邏輯。

public UserRecord(String username, String email, int userId) {
    this.username = username;
    this.email = email;
    this.userId = userId;
    if (userId < 1) {
      throw new IllegalArgumentException("UserId can not be less than 1");
    }
  }

有一個很棒的功能,我們可以通過消除不必要的細節來創建一個緊湊的構造函數。例如,上面具有自定義邏輯的規范構造函數可以以緊湊的形式重寫為:

public UserRecord {
    if (userId < 1) {
      throw new IllegalArgumentException("UserId can not be less than 1");
    }
  }

比較Lombok和Record:

功能

Lombok

Record

不變性

沒有

是的

可擴展性

是的

沒有

樣板代碼

減少

減少

可讀性

可能會更難閱讀

更容易閱讀

穩健性

不太穩健

更堅固

第三方依賴

是的

沒有

IDE 兼容性

不容易

簡單

有性能差異嗎?

不會。就性能而言,使用Java記錄和Lombok注釋沒有顯著差異。兩者生成的代碼一旦編譯,在性能特征方面與手寫代碼沒有什么不同。生成的代碼由 Java 編譯器優化,因此幾乎沒有性能開銷。

結論:

本文表明我們應該使用記錄來編寫更清晰、更具可讀性的代碼。記錄可以幫助我們減少樣板代碼,而無需任何第三方庫。Lombok 與 IDE 存在一些兼容性問題。

分享到:
標簽:Lombok
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定