关于表示泄露的问题

可变对象和不可变对象

可变对象与不可变对象

概念1

不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象
String str = “a” ;
str = “b” ;
// 两处的 str 不是同一个对象 == 判断 或输出 对象地址信息 不同

可变对象(Mutable Objects):相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类
不可变对象的类即为不可变类(Immutable Class)。JAVA平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等

不可变类

类不可被继承:
将类声明为final, 或者使用静态工厂并声明构造器为private。
如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。
使用private和final修饰符来修饰该类的属性

注:如果成员属性为可变对象属性,不要使这些对象改变:

1)不要提供更改可变对象的方法,如 set 方法
2)不要共享对可变对象的引用,不要存储传给构造器的外部可变对象的引用。因为引用可变对象的成员变量和外部可变对象的引用指向同一块内存地址,用户可以在不可变类之外通过修改可变对象的值。

我们通常需要访问这些变量,我们可以做一个比喻,一个类相当于一个档案室,里面有很多的档案,这个档案库有两种管理机制,immutability相当于每当需要查阅其中的档案是,拿到的都是档案的复制品,而mutability相当于拿到的是原始的档案。在Java内部,immutability返回的是内容,而mutability返回的是指针。所以就有了这样有趣的情况。

表示泄露就在这里出现了:如果你是一个不可变类,你却在某个函数中返回了自己可变的成员变量——那样,对于这个成员变量(指针)的修改就可以改变你这个类。因此,返回成员变量的时候需要clone().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值