浏览 4705 次
锁定老帖子 主题:关于实现一个不变类的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-15
final class DiskDriveInfo { private int driveSize; private String volumeLabel; private User driveShare; DiskDriveInfo(int size, String volLabel, User share); { driveSize = size; volumeLabel = volLabel; driveShare = (User); share.clone();; } public User share(); { return (User); driveShare.clone();; } } 我现在想问的是,既然要实现不变类,那么为什么对从构造函数中传入的User对象进行克隆呢?在share()这个方法中不是已经对其进行克隆了么? 如果在初始化的时候就克隆,那么在share() 中就没有必要在克隆了。总之,我认为不应该在构造函数中进行克隆。 请大虾帮解释一下 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-04-15
如果在构造的时候不克隆,那么在类中保存在User对象只是一个引用而以。这样的花,User对象发生改变则,
DiskDriveInfo 对象内部的User也发生改变。 所谓不变类 不就 变了吗? |
|
返回顶楼 | |
发表时间:2004-04-15
明白了,就是说如果user改变了,那么drivershare也变了,那么即使使用share()方法,那么返回的也是改变以后的clone。对把
|
|
返回顶楼 | |
发表时间:2004-04-15
不好意思,我理解错了,应该是share()方法,那么返回的还是改变以前的clone
|
|
返回顶楼 | |
发表时间:2004-05-13
java中得clone是浅复制.
如果你需要clone9种基本类型之外得,及那些不会变的类,比如String,BigDecimal,Integer...等,就需要自己在clone中把那些也clone()了. 所以深复制基本上会形成一个递归得复制. |
|
返回顶楼 | |
发表时间:2004-05-28
如果要深层clone的话,可以用序列化(Serializable),
如果User类是一个不变类的话(就是只有get方法,没有set方法或者其它能改变它本身的某些属性的方法),就不用了clone,直接return就可以了. |
|
返回顶楼 | |
发表时间:2004-05-28
在构造函数里使用clone方法不是一个安全的措施
如果Use类不是final的,clone方法返回的不一定是User类,它有可能返回另一个不可信的子类的实例。 这里应该使用保护性拷贝 详细的解释可以参见Effective Java第24条——需要时使用保护性拷贝 |
|
返回顶楼 | |