package lang.imutable.address;
public class MemberV1 {
private String name;
private Address address;
public MemberV1(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "MemberV1{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
package lang.imutable.address;
public class MemberMainV1 {
public static void main(String[] args) {
Address address = new Address("서울");
MemberV1 memberA = new MemberV1("회원A", address);
MemberV1 memberB = new MemberV1("회원B", address);
// 회원A, 회원B 처음 주소는 모두 서울
System.out.println("memberA = " + memberA);
System.out.println("memberB = " + memberB);
// 회원B의 주소를 부산으로 변경
memberB.getAddress().setValue("부산");
System.out.println("부산 -> memberB.address");
System.out.println("memberA = " + memberA);
System.out.println("memberB = " + memberB);
}
}
사이드 이펙트가 발생해서 B의 주소를 변경할 시에, A의 주소도 같이 변경된다.
package lang.imutable.address;
public class MemberV2 {
private String name;
private ImutableAddress address;
public MemberV2(String name, ImutableAddress address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ImutableAddress getAddress() {
return address;
}
public void setAddress(ImutableAddress address) {
this.address = address;
}
@Override
public String toString() {
return "MemberV2{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
변경이 불가능한 Immutable 클래스를 사용하고 있다.
package lang.imutable.address;
public class MemberMainV2 {
public static void main(String[] args) {
ImutableAddress address = new ImutableAddress("서울");
MemberV2 memberA = new MemberV2("회원A", address);
MemberV2 memberB = new MemberV2("회원B", address);
// 회원A, 회원B 처음 주소는 모두 서울
System.out.println("memberA = " + memberA);
System.out.println("memberB = " + memberB);
// 회원B의 주소를 부산으로 변경
// memberB.getAddress().setValue("부산");
memberB.setAddress(new ImutableAddress("부산"));
System.out.println("부산 -> memberB.address");
System.out.println("memberA = " + memberA);
System.out.println("memberB = " + memberB);
}
}
회원 B의 주소를 변경하려고 한다.
하지만, ImmutableAddress는 값을 변경할 수 있는 메서드가 없다.
따라서 새로운 Address 객체를 생성해서 참조해야 한다.