所谓的不可变类,顾名思义,也就是不可以被改变(对象一旦被初始化,那么就会保持原来的样子了)
问题:什么不可以被改变呢?
答:类包括属性和方法,也就是属性不可以被改变,其实是指对象一旦创建,那么该该对象的状态(属性)就不可以被改变
问题:那怎么确保可以不被改变呢?
答:
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());
}
}
疑问:
属性有没有必要是final呢?因为,我已经通过private和禁用set控制了对属性的访问,那么它难道还可以被修改吗?