成员都是基本类型的(非组合类)类
成员用private final修饰,只能提供一个全参构造,只能提供getter方法
/**
* @author 张家琛
* @version 1.0
* @date 2023/1/24 21:17
*/
public class Address {
private final String detail;
private final String postCode;
public Address(String detail, String postCode) {
this.detail = detail;
this.postCode = postCode;
}
public String getDetail() {
return detail;
}
public String getPostCode() {
return postCode;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj.getClass() == Address.class) {
var address = (Address) obj;
if (this.getDetail().equals(address.getDetail()) && this.getPostCode().equals(address.getPostCode())) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return detail.hashCode() + postCode.hashCode() * 31;
}
}
组合:下面定义了Name类和Person类,让Person类是不可变的
class Name {
private String firstName;
private String lastName;
public Name() {
}
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
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 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());
}
public static void main(String[] args) {
var name = new Name("老三", "张");
var person = new Person(name);
System.out.println(person.getName().getFirstName());
name.setFirstName("老四");
System.out.println(person.getName().getFirstName());
}
}
输出结果:
由于Name类实例可以通过Setter来操作成员变量,所以需要Person在构造时创建一个新的Name实例(当成本体)存储传入Name(模具)的值,然后每次Person实例调用Getter时都会新创建一个name对象(本体的复印件),也就是说永远都不让访问那个构造时新创建的本体