「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java でのセッターとレコードの設定

Java でのセッターとレコードの設定

2024 年 11 月 8 日に公開
ブラウズ:637

Setters en un Record en Java

record は、不変であることを特徴とする構造体です。つまり、 record 型のオブジェクトが作成されると、その属性は変更できません。これは、他のプログラミング言語で data-class または DTO (Data Transfer Object) と呼ばれるものと同等です。しかし、setter メソッドを使用して属性を変更する必要があり、レコード内の各属性が Final タイプであることを考慮すると、どのようにこれを実現できますか?

これが可能かどうかを示すために、名前と価格という 2 つの属性を持つレコード 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'

しかし、record が追加のメソッドを持つことができることがわかっている場合、答えは「ノー」なので、name 属性を変更して新しい値を割り当てる setName(String 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 の新しいインスタンスを返す場合、それが可能であるということです。 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 を使用する必要があります。 record または class をいつ使用するかについて詳しくは、次の投稿を参照してください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/asjordi/setters-en-un-record-en-java-4fb6?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3