【发布时间】:2012-11-03 09:36:42
【问题描述】:
我正在开发一个类库。
- 我有一个用于矩阵的抽象基类 Matrix,它提供了一些基本方法的实现。
- 派生自 Matrix 的是不同类型矩阵的具体子类。
- 我要求矩阵是可克隆的,所以 Matrix 实现了 Cloneable 接口。
- 从 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;
}
...
}
【问题讨论】:
-
为什么一开始就允许你的对象被克隆?
-
一些操作(如转置)可以通过返回原始矩阵周围的小包装器并即时计算值来轻松实现。此外,您可以在某些情况下减少内存占用(即大型稀疏矩阵上的操作)。只要原始矩阵是不可变的,这就可以正常工作。否则对原始矩阵的任何更改都会对结果产生副作用。但是我现在通过提供一个 getImmutable() 方法解决了这个问题,该方法对于不可变子类只返回对象本身,而可变子类返回一个不可变副本。不再克隆。
标签: java clone class-design immutability