不可变类型是否需要复制构造函数?

Moi*_*ira 6 java immutability

说我有一个不可变的DecimalNumber类:

public final class DecimalNumber {

    public final String str;

    public DecimalNumber(String str) { this.str = str; }
    public DecimalNumber(DecimalNumber copy) { this(copy.str); }

    public boolean isZero() {...}

    public DecimalNumber add(DecimalNumber other) {...}

    ...

}
Run Code Online (Sandbox Code Playgroud)

我决定这样实施add:

public DecimalNumber add(DecimalNumber other) {

    if (other.isZero())
        return /* the same object */

    ...

}
Run Code Online (Sandbox Code Playgroud)

我应该返回this(减少内存使用)还是复制对象new DecimalNumber(this)

我认为简单地返回this应该没问题,但是创建一个新对象是有益还是有理由?或者它是否是首选?

Hoo*_*pje 3

如果一个类是不可变的且最终的,那么您可以返回this

如果它不是最终的,您就无法确定该this实例确实是不可变的。您实际上可能正在处理添加可变状态的子类。

请注意,只有在以下情况下,类才是真正不可变的:

  • 它的所有领域都是最终的,甚至是私人领域。(由于 Java 内存模型允许其他线程查看非 Final 字段的未完成/默认值,因此仅具有 getter 的非 Final 字段是不够的。)
  • 它的所有字段本身都是不可变类,或者对它们的访问受到限制,以便您可以确保它们永远不会更改。

在您的情况下,满足这两个条件,因为String是一个不可变的类。如果您知道您的类不存在子类,那么您可以(事实上,恕我直言,应该)返回this。为了确保您的类不存在任何子类,您可以将其设置为final.