不可变类

所谓的不可变类,顾名思义,也就是不可以被改变(对象一旦被初始化,那么就会保持原来的样子了)

问题:什么不可以被改变呢?

答:类包括属性和方法,也就是属性不可以被改变,其实是指对象一旦创建,那么该该对象的状态(属性)就不可以被改变

问题:那怎么确保可以不被改变呢?

答:

1.final修饰符,这个可以确保属性只能被赋值一次

2.不提供set方法,只提供get方法,这个可以确保不让你修改属性。

3.属性都是private,通过构造器去初始化

注意点:那么如果是属性是引用类型呢?我不是可以直接通过get引用类型来进行更改引用类型的状态吗?或者通过初始化的时候传进来的引用类型来更改吗?

答:这样的解决方式就是get的时候,我们返回的不是自己的引用类型的对象,而是新建一个对象去返回,这样即使你get到以后,这个对象并不是我自己的,而是全新的

例子:

class Name {
  private String firstName;
  private String lastName;
 
public Name(){}
public String getFirstName() {
  return firstName;
}

public void setFirstName(String firstName) {
  this.firstName = firstName;
}
public String getLastName() {
  return lastName;
}

public void setLastName(String lastName) {
 this.lastName = lastName;
}

public Name(String firstName, String lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}
}

public class Person {
 private final Name name;
 
public Person(Name name) {
   this.name=new Name(name.getFirstName(),name.getLastName());   --->通过匿名类来解决
  }
 
public Name getName() {
  //相当于返回的是一个复制
  return new Name(name.getFirstName(),name.getLastName());
  }
}

Person类就是一个不可变类,name虽然是引用类型,但是我控制了它的被改变,方式就是在初始化和get的时候,我是重新生成了一个对象去返回

疑问:

属性有没有必要是final呢?因为,我已经通过private和禁用set控制了对属性的访问,那么它难道还可以被修改吗?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值