关于不可变类的几个小问题

什么是不可变类(JAVA)

定义

不可变类的意思是,对该类对象实例化后,其对象属性在整个生命周期内不再改变

如何创建一个不可变类

创建一个不可变类时,需要遵循以下四条规则

  1. 不要提供任何修改对象状态的方法
  2. 确保类中的所有方法不被重载
  3. 确保类中的成员对象为private
  4. 如果类中存在成员不是基本数据类型或不可变类时,赋值过程中避免直接使用其引用或将对象的引用暴露给外部(自己码的描述,可能不是特别精确严谨。望理解,如有更好的描述还望大神多多指点)

代码例子

这是一个错误的例子 :违背了上述规则中的第四条

原因: 其成员数组变量 i 赋值过程中,直接将参数传递的引用值赋给成员变量 i


final class Kiil{
		private int[] i;
		public Kiil (int[] i){
			this.i=i;		
		}
		public void addFor() {
			for(int j=0;j<this.i.length;j++) {
				System.out.print("J= "+j+"\n");
			}
		}
}

上述代码所创建的类满足了前面所提到的前三点规则,但是未满足第四点。因为通过这样的方式直接将参数传递的引用值赋予成员变量。无法保证这个类是一个不可变类。

因为我们从外部改变其参数传递的引用中值的内容间接的就改变了成员变量 i 的值,无法得到类的不可变,破坏了其封装性。

正确的写法:


final class Kiil{
		private int[] i;
		public Kiil (int[] i){
			this.i=i.clone();		
		}
		public void addFor() {
			for(int j=0;j<this.i.length;j++) {
				System.out.print("J= "+j+"\n");
			}
		}
}

将构造函数中 this.i=i修改为 this.i=i.clone();,从而使得其类成员变量的引用是非外部可改变。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值