0

不変クラスでミューテーターメソッドを書く際のルールは何ですか?

以下は最初の試みです - 考慮してください:

public final class Person
{
    private final String firstName;
    private final String lastName;

    public Person(String firstName, String lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() { return this.firstName; }
    public String getLastName() { return this.lastName; }

    public Person setFirstName(String newFirstName)
    {
        return new Person(newFirstName, this.lastName);
    }

}

setFirstName() メソッドは明らかに対象のミューテーターです。これは、古いインスタンスのコピーである新しいインスタンスを返し、newFirstName 値を firstName プロパティとして保存する必要があります。

  1. これは意味的に正しいですか?つまり、それは望ましい効果を達成するでしょうか?

  2. Person クラス全体はまだ不変ですか? そして最終的に、スレッドセーフですか?

  3. このアプローチが実行可能である場合、どのような規則またはその他の考慮事項を遵守する必要がありますか?

  4. この件に関して他にご意見がございましたら、お気軽にお寄せください。

編集:

  1. setFirstName() メソッドで新しいオブジェクトを作成する方法で、アトミックに行われますか?
4

1 に答える 1

0

このPersonインスタンスがメソッドを呼び出している場所以外の場所で参照されている場合setFirstName()、そこでは更新されません。

問題または機能である可能性があります。後者の場合、メソッドの名前を次のsetFirstName()ように変更しますcloneWithFirstName(String newFirstName)

于 2014-11-16T03:21:41.700 に答える