不可变类

来源:互联网 发布:javascript中文手册 编辑:程序博客网 时间:2024/05/18 12:31

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

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

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

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

答:

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控制了对属性的访问,那么它难道还可以被修改吗?


原创粉丝点击