论坛首页 Java企业应用论坛

关于实现一个不变类的问题

浏览 4704 次
精华帖 (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() 中就没有必要在克隆了。总之,我认为不应该在构造函数中进行克隆。
请大虾帮解释一下
   发表时间:2004-04-15  
如果在构造的时候不克隆,那么在类中保存在User对象只是一个引用而以。这样的花,User对象发生改变则,
DiskDriveInfo 对象内部的User也发生改变。

所谓不变类 不就 变了吗?
0 请登录后投票
   发表时间:2004-04-15  
明白了,就是说如果user改变了,那么drivershare也变了,那么即使使用share()方法,那么返回的也是改变以后的clone。对把
0 请登录后投票
   发表时间:2004-04-15  
不好意思,我理解错了,应该是share()方法,那么返回的还是改变以前的clone
0 请登录后投票
   发表时间:2004-05-13  
java中得clone是浅复制.
如果你需要clone9种基本类型之外得,及那些不会变的类,比如String,BigDecimal,Integer...等,就需要自己在clone中把那些也clone()了.
所以深复制基本上会形成一个递归得复制.
0 请登录后投票
   发表时间:2004-05-28  
如果要深层clone的话,可以用序列化(Serializable),
如果User类是一个不变类的话(就是只有get方法,没有set方法或者其它能改变它本身的某些属性的方法),就不用了clone,直接return就可以了.
0 请登录后投票
   发表时间:2004-05-28  
在构造函数里使用clone方法不是一个安全的措施
如果Use类不是final的,clone方法返回的不一定是User类,它有可能返回另一个不可信的子类的实例。
这里应该使用保护性拷贝
详细的解释可以参见Effective Java第24条——需要时使用保护性拷贝
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics