レコードは、不変であることを特徴とする構造です。つまり、タイプレコードのオブジェクトが作成されると、そのオブジェクトは属性は変更できません。これは、他のプログラミング言語で 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 の新しいインスタンスを返す場合、それが可能であるということです。 レコードが持つ属性の数によっては、このプロセスは少し面倒になる可能性があります。
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 } }
この時点で、レコード が情報を簡単な形式で保存および転送できる構造になるように設計されていることを考慮して、このアプローチが解決しようとしている問題に適切であるかどうかを検討することが重要です。アプリケーション内で不変であるか、より柔軟な構造が必要な場合は、クラス を使用する必要があります。 レコード または クラス をいつ使用するかについて詳しくは、次の投稿を参照してください。
以上がJava でのセッターとレコードの設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。