java - 为不可变类实现 clone()

标签 java clone class-design immutability

我正在开发一个类库。

  1. 我有一个矩阵的抽象基类 Matrix,它提供一些基本方法的实现。
  2. 从 Matrix 派生的是不同类型矩阵的具体子类。
  3. 我要求矩阵是可克隆的,所以 Matrix 实现了 Cloneable 接口(interface)。
  4. 一些从 Matrix 派生的类是不可变的

不可变类的克隆方法不返回对象的克隆,而是返回对象本身是否可以接受?

用于澄清的一些(过于简化的)代码:

abstract class Matrix implements Cloneable {
   ...
}

class ImmutableMatrix extends Matrix {
    ImmutableMatrix clone() {
        return this;
    }
    ...
}

class SomeOtherMatrix extends Matrix {
    SomeOtherMatrix clone() {
        SomeOtherMatrix other = super.clone();
        ...
        return other;
    }
    ...
}

最佳答案

我原以为调用 super.clone() 就足够了。

如果您的类是不可变的,那么它在构造时应该已经克隆了所有可变类。因此,我认为拥有类(class)所有字段的浅拷贝是安全的。

JavaDocs 指出 x.clone() != x 是首选。虽然这不是绝对要求,但您只返回 this 的计划肯定会违反这一要求。

关于java - 为不可变类实现 clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13207888/

相关文章:

java - 我不断收到<identifier>预期错误

java - 如何使用约束规划来优化购物篮?

java - 我应该在 Java 中使用 Clone 方法吗?

rust - 派生特征会导致意外的编译器错误,但手动实现有效

java - OOP 设计——什么时候有一个共同的基类 [缺陷设计?]

c# - 在基类中使用的继承类中创建的对象

c# - 你什么时候想在 C# 中嵌套类?

java - cassandra 重新安装在 ubuntu 上不起作用

java - 无法在 JBoss 6.1.0 中使用资源注释注入(inject) JMS QueueConnectionFactory

javascript - Ext JS 4 - 克隆节点并附加到 DOM 中的其他位置