이 장의 내용은 생성자에 코드를 넣지않음으로써 인자값을 퓨어하게 유지하고 객체를 사용 시점에 파싱을하던 변환을하던 하라는 뜻이다(인자값을 다른 타입의 객체로 감싸는건 가능)
즉 생성자는 말 그대로 생성만 하라는것
책에서 설명하는 올바른 예
//생성자는 필드값을 초기화만 해주고 intValue()를 사용한 "시점"에 파싱된 값 반환
class StringAsInteger implements Number {
private String text;
public StringASInteger(String txt) {
this.text = txt;
}
public int intValue() {
return Integer.parseInt(this.text);
}
}
책에서 설명하는 잘못된 예
//생성자에서 값을 변환하고 intValue()를 사용해 "이미" 변환된 값 반환
class StringAsInteger implements Number {
private int num;
public StringASInteger(String txt) {
this.num = Integer.parseInt(txt);
}
public int intValue() {
return this.num;
}
}
실제로 올바른 예 에서의 코드가 실행속도가 더 빠르다고 한다.
다음으로
생성자에어 직접 파싱을 수행하는 코드는 최적화가 불가능 합니다. 이 경우에는 객체를 만들 때마다 매번 파싱이 수행되기 때문에 실행 여부를 제어할 수 없습니다.
이 말은 예를 들어 인자값이 여러개가 넘어왔을때 단 하나의 인자값만을 사용하는 경우에도 모든 인자값을 파싱하는 작업을 CPU가 하기 때문에 성능적으로도 좋지않고 인자값에대한 제어권도 잃게 된다는 것 이다.
1-2장에서의 느낀점에서 유효성검증을 어디서 해야하는지에 대한 고민을 했었는데 파싱같은 작업은 넘어온 값 자체를 건드는 작업이기에 사용시점에 파싱을 하는건 옳다고 생각한다 하지만 여전히 유효성검증같은 경우엔 넘어온 값에 대해 신뢰성을 주는 작업이라 생각하기에 유효성검증은
클래스 안에서 하는게 응집력도 올라가고 좋지 않나 생각한다.