public class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
public static Complex valueOf(double re, double im) {
return new Complex(re, im);
}
}
public class PhoneNumber {
private String phoneNum;
// 생성자, 게터, 세터 ...
}
public class Person {
private final String name;
private final PhoneNumber phoneNumber;
public Person(String name, PhoneNumber phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
// 게터, 세터 ...
}
void immutable_test() {
PhoneNumber phoneNumber = new PhoneNumber("010-1111-1111");
Person person = new Person("형욱", phoneNumber);
String beforeNumber = person.getPhoneNumber().getPhoneNum().toString();
phoneNumber.setPhoneNum("010-2222-2222");
String afterNumber = person.getPhoneNumber().getPhoneNum().toString();
System.out.println(beforeNumber); // 010-1111-1111
System.out.println(afterNumber); // 010-2222-2222
}
// 보완하기
public class Person {
private final String name;
private final PhoneNumber phoneNumber;
public Person(String name, PhoneNumber phoneNumber) {
this.name = name;
this.phoneNumber = new PhoneNumber(phoneNumber.getPhoneNum());
}
// 게터, 세터 ...
}
public static BigDecimal valueOf(long val) {
if (val >= 0 && val < ZERO_THROUGH_TEN.length)
return ZERO_THROUGH_TEN[(int)val];
else if (val != INFLATED)
return new BigDecimal(null, val, 0, 0);
return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
}
private static final BigDecimal ZERO_THROUGH_TEN[] = {
new BigDecimal(BigInteger.ZERO, 0, 0, 1),
new BigDecimal(BigInteger.ONE, 1, 0, 1),
new BigDecimal(BigInteger.TWO, 2, 0, 1),
new BigDecimal(BigInteger.valueOf(3), 3, 0, 1),
new BigDecimal(BigInteger.valueOf(4), 4, 0, 1),
new BigDecimal(BigInteger.valueOf(5), 5, 0, 1),
new BigDecimal(BigInteger.valueOf(6), 6, 0, 1),
new BigDecimal(BigInteger.valueOf(7), 7, 0, 1),
new BigDecimal(BigInteger.valueOf(8), 8, 0, 1),
new BigDecimal(BigInteger.valueOf(9), 9, 0, 1),
new BigDecimal(BigInteger.TEN, 10, 0, 2),
}