Java & Kotlin
builder pattern 연습해보기
필자A
2022. 6. 29. 23:07
builder pattern은 인스턴스 생성 전략(?) 정도로 봐주시면 좋습니다.
kotlin으로 작성하였지만 사실 kotlin이 제공해주는 기능때문에 kotlin에서는 builder pattern이 필요없다고 생각합니다.
일단 시작하겠습니다.
언제 사용하지?
1. class에 생성자가 많고 복잡하여 실수가능성이 있다.
2. optional한 필드가 많다.
어떻게 작성하지?(나름대로의 작성법)
1. required member는 builder 생성자 내부에 작성
2. optional member, auto Input member는 builder 생성자 외부에 작성
3. build class 생성자는 private 접근 제어자 설정
4. build'er' class의 setter들은 builder class를 반환, 그래야 줄줄이 비엔나🌭가 가능함
장점
1. 반드시 값을 넣어줘야하는 필드에서 실수를 안한다.
2. 넣지않아도 될 값은 생성시 제외가능
3. 가독성 상승
의문점1. 상황에 따라서 강제성이 필요한 멤버수가 변경됨
class PrivateCard private constructor(
// Required Member
private var name: String,
private var age: Int,
// Optional Input Member
private var sharedUser: String?,
private var secretCode: Int?,
// Auto Input Member
private val createdAt: LocalDateTime
) {
override fun toString(): String =
"{ name: $name, age: $age, sharedUser: $sharedUser, secretCode: $secretCode. createdAt: $createdAt }"
// 강제성이 있다면 Builder 의 Constructor 에 넣기
class Builder(
// Required Input Member
private val name: String,
private val age: Int,
){
// Optional Input Member
private var sharedUser: String? = null
private var secretCode: Int? = null
// Auto Input Member
private val createdAt: LocalDateTime = LocalDateTime.now()
fun sharedUser(sharedUser: String): Builder {
this.sharedUser = sharedUser
return this
}
fun secretCode(secretCode: Int): Builder {
this.secretCode = secretCode
return this
}
fun build() = PrivateCard(name, age, sharedUser, secretCode, createdAt)
}
}
fun main() {
val privateCard = PrivateCard
.Builder(name="min_su", age=23)
.sharedUser("tom")
.build()
println(privateCard)
}
{ name: min_su, age: 23, sharedUser: tom, secretCode: null. createdAt: 2022-06-29T22:34:15.462366 }
반응형