Java Mutator在不可变类上的实现

Java Mutator在不可变类上的实现,java,immutability,mutators,Java,Immutability,Mutators,在不可变类上编写mutator方法的规则是什么 以下是第一次尝试-请考虑: public final class Person { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.last

在不可变类上编写mutator方法的规则是什么

以下是第一次尝试-请考虑:

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属性

  • 这在语义上正确吗?也就是说,它能否达到预期的效果

  • Person类总体上仍然是不变的吗?最终,线程安全

  • 如果这种方法可行,应遵守哪些规则或其他注意事项

  • 请随时提供有关此问题的任何其他反馈

  • 编辑:

  • 通过在setFirstName()方法中创建新对象的方式,它是以原子方式完成的吗

  • 问题是,如果这个
    Person
    实例在调用
    setFirstName()
    方法以外的任何地方被引用,它将不会在那里更新


    可能是问题或功能。在后一种情况下,我会将方法
    setFirstName()
    重命名为类似
    cloneWithFirstName(字符串newFirstName)

    什么是“期望的效果”?@PM77-1“返回一个新实例,该实例是旧实例的副本,但firstName属性设置为newFirstName除外。该类被声明为不可变的事实意味着对其(状态/属性)的任何更改都必须创建一个新实例以适应这种更改。”。也许可以重命名mutator方法的命名,例如changeXXX(),其中XXX表示状态/属性描述。但您不能更改实例。您正在创建它的克隆,其中用提供的参数替换一个新字段值。所以它实际上不是一个变异子,它是一种克隆方法。