ホームページ > Java > &#&チュートリアル > Java でのセッターとレコードの設定

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

Barbara Streisand
リリース: 2024-10-22 06:07:31
オリジナル
284 人が閲覧しました

Setters en un Record en Java

レコードは、不変であることを特徴とする構造です。つまり、タイプレコードのオブジェクトが作成されると、そのオブジェクトは属性は変更できません。これは、他のプログラミング言語で 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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート