private int position = 0;
private Position(int position) {
this.position = position;
}
public static Position createStartPosition() {
return new Position(START_POSITION_VALUE);
}
정적 팩토리 메서드 잘 만들어주셨습니다 👍
이제 position을 직접 초기화 해주는 부분은 없어도 되지 않을까요? 😁
직접 초기화라고 말씀하신 부분이 private int position = 0; 이 부분 맞을까요?
위에서 말씀하신 독자에게 여지를 주지 않으려면 직접 초기화를 해줘야 하는 것 아닌가요??
해당 코멘트를 남길 때 코드에는 기본 생성자(빈 생성자)가 있었던 걸로 기억해요.
private int position; public Position() { }
이 경우에 position이 어떤 값으로 초기화되는지 명시적으로 확인할 수 있으면 좋겠다는 의미로 남긴 코멘트였습니다.
지금은 기본 생성자가 사라지고 해당 기능이 정적 팩토리 메서드에서 처리되고 있습니다.
팩토리 메서드는 주생성자를 사용해서 초기화 하고 있죠.
그래서 position = 0 코드는 동작에 영향을 주지 않습니다.
또, 만약 Position을 불변 객체로 만든다면 컴파일 에러도 날거구요.얘기가 나온 김에 주생성자에 대해서 공부해볼까요?
생성자에는 primary constructor
와 secondary constructor
가 있다.
이름 대로 주생성자는 메인이고, secondary constructor
는 단순히 주생성자를 호출하기 위한 단계일 뿐이다.
final class Cash {
private final int cents;
private final String currency;
public Cash() { // secondary
this(0);
}
public Cash(int cts) { // secondary
this(cts, "USD");
}
public Cash(int cts, String crn) { // primary
this.cents = cts;
this.currency = crn;
}
// methods here
}
주생성자는 하나 뿐이고, 나머지는 secondary constructor**이다.
secondary constructor는
this(..)`를 통해서 주생성자를 호출하는 것이 역할이다.
잘 구성된 클래슨느 반드시 하나의 주생성자만 가지고 있어야하고, 모든 secondary constructor
이후에 선언되어야 한다. 그 이유는 코드의 중복을 줄여주기 때문이다.
final class Cash {
private final int cents;
private final String currency;
public Cash() { // primary
this.cents = 0;
this.currency = "USD";
}
public Cash(int cts) { // primary
this.cents = cts;
this.currency = "USD";
}
public Cash(int cts, String crn) { // primary
this.cents = cts;
this.currency = crn;
}
// methods here
}
일반적으로 내가 짜오던 코드이다. 사실 인텔리제이에서 생성자를 만드는 것은 단축키 (Alt +Ins)를 누르면 쉽게 만들기 때문에 크게 귀찮음을 느끼지 못하고 있었다. 하지만 읽는 사람의 입장에서 보면 너무 많은 중복이다.
https://www.yegor256.com/2015/05/28/one-primary-constructor.html