아이템 34
기본 생성자에 이름 있는 옵션 아규먼트를 사용하라
점층적 생성자 패턴
- 점층적 생성자 패턴은 프로퍼티별 디폴트 값을 가질 경우 파라미터별로 생성자를 각각 만드는 패턴이다.
class Foo{
val size:Int
val length: Int
constructor(size: Int,length: Int){
this.size=size
this.length = length
}
constructor(size:Int): this(size,0)
}
- 코틀린에서는 디폴트 아규먼트를 지정할 수 있기 때문에 해당 코드는 무의미하다.
- 이름 있는 아규먼트를 활용해서 명시적으로 이름을 붙여주면, 의미가 훨씬 명확하다.
빌더 패턴
- 자바에서는 이름 있는 파라미터와 디폴트 아규먼트를 사용할 수 없어, 빌더패턴을 사용한다. 빌더 패턴을 사용하면 파라미터의 순서를 원하는대로 지정할 수 있고, 파라미터에 이름을 붙일 수 있다.
- 빌터 패턴보다 이름있는 아규먼트의 장점
- 더 짧다.
- 빌더 패턴을 구현하려면 많은 코드를 입력해야한다.
- 더 명확하다.
- 객체가 어떻게 생성되는 지 확인하고 싶을때, 빌더 패턴은 내부 구현 메서드를 다 확인해야한다.
- 사용하기 쉽다.
- 기본생성자와 다르게 빌더 패턴은 언어 위에 추가로 구현한 개념이므로 추가 지식이 필요하다.
- 동시성과 관련된 문제가 발생하지 않는다.
- 빌더 팬턴에서 프로퍼티는 mutable로 스레드 안전하게 구현하기 어렵다
- 더 짧다.
- 빌더 패턴으로 구현해야하는 경우
- 값의 의미를 묶어서 지정할 경우
AlertDialog.Builder() .setPositiveButton(R.string.fire,{d,id->...}) ....
- 특정 값을 누적하는 형태
Router.Builder() .addRoute(path="/",::showHome) .addRoute(path="/ysers",::showUsers)
- 위 케이스를 dsl로 구현하는 것도 가능하다. dsl 구현시 빌더 패턴보다 유연하고 명확해서 좋지만 개발하는데 시간이 더 소요된다.
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item 36. 상속보다는 컴포지션을 사용하라 (0) | 2022.06.07 |
---|---|
[이펙티브 코틀린] Item 35. 복잡한 객체를 생성하기 위한 DSL을 정의하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 33. 생성자 대신 팩토리 함수를 사용하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 31 - 32. 문서 규약과 추상화 규약 (0) | 2022.05.29 |
[이펙티브 코틀린] Item 28 ~30. API 안정성 및 가시성 (0) | 2022.05.29 |