首頁 Java java教程 Java 中的 Setters 和 Record

Java 中的 Setters 和 Record

Oct 22, 2024 am 06:07 AM

Setters en un Record en Java

record 是一種結構體,其特徵是不可變,也就是說,一旦創建了record 類型的對象,它的屬性無法修改,它相當於其他程式語言所說的data-class或DTO(資料傳輸物件)。但是,如果需要使用 setter 方法來修改某個屬性,並且考慮到記錄中的每個屬性都是 Final 類型,那麼如何實現呢?

為了證明這是否可行,讓我們建立一個具有名稱和價格兩個屬性的記錄 Product,以及在 Java 中定義記錄時自動建立的對應方法:

public record Product(String name, double price) { }
登入後複製

現在,如果你建立一個 Product 類型的物件並嘗試修改 name 屬性,你會發現這是不可能的,甚至沒有 setter 方法來做到這一點:

Product p = new Product("Bread", 1.0);
p.setName("Water"); // Error: cannot resolve method 'setName' in 'Product'
登入後複製

但是,如果我們知道記錄可以有其他方法,那麼我們可以創建一個setName(String name)方法來修改name屬性並為其分配新值,因為答案是否定的. ,它不像普通課堂那樣工作,例如:

public record Product(String name, double price) {
    // Error: cannot asign a value to final variable 'name'
    public void setName(String name) {
        this.name = name;
    }
}
登入後複製

那麼如何在Java中修改記錄的屬性呢?答案是,如果 set 方法傳回 record 的新實例及其每個屬性,並且顯然帶有修改後的屬性,則可以。這個過程可能有點乏味,取決於記錄具有的屬性數量。

public record Product(String name, double price) {

    public Product setName(String name) {
        return new Product(name, this.price);
    }

    public Product setPrice(double price) {
        return new Product(this.name, price);
    }

}
登入後複製

這樣,當呼叫任何一個setter方法時,都會得到一個具有修改屬性的Product類型的新實例,例如:

Product p = new Product("Bread", 1.0);
Product q = p.setName("Milk");
Product r = q.setPrice(2.0);
登入後複製

對於每個物件 p、q 和 r,其 get、equals、hashCode 和 toString 方法都可以正常調用,考慮到沒有一個物件彼此相等,因為每個物件的屬性值都不同。

public class Main {
    public static void main(String[] args) {
        Product p = new Product("Bread", 1.0);
        Product q = p.setName("Milk");
        Product r = q.setPrice(2.0);

        System.out.println(p); // Product[name=Bread, price=1.0]
        System.out.println(q); // Product[name=Milk, price=1.0]
        System.out.println(r); // Product[name=Milk, price=2.0]

        System.out.println(p.equals(q)); // false
        System.out.println(q.equals(r)); // false
        System.out.println(r.equals(p)); // false
    }
}
登入後複製

此時,考慮到記錄被設計為一種允許以簡單的方式儲存和傳輸資訊的結構,考慮這種方法是否適合正在解決的問題非常重要。在應用程式中的方式並且是不可變的,或者如果需要具有更大靈活性的結構,那麼應該使用 class 。有關何時使用記錄的更多信息,您可以參考以下帖子。

以上是Java 中的 Setters 和 Record的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte 2025年的前4個JavaScript框架:React,Angular,Vue,Svelte Mar 07, 2025 pm 06:09 PM

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?

Node.js 20:關鍵性能提升和新功能 Node.js 20:關鍵性能提升和新功能 Mar 07, 2025 pm 06:12 PM

Node.js 20:關鍵性能提升和新功能

冰山:數據湖桌的未來 冰山:數據湖桌的未來 Mar 07, 2025 pm 06:31 PM

冰山:數據湖桌的未來

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Mar 07, 2025 pm 05:52 PM

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復

如何在Java中實施功能編程技術? 如何在Java中實施功能編程技術? Mar 11, 2025 pm 05:51 PM

如何在Java中實施功能編程技術?

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?

See all articles