본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item 34. 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라

아이템 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 구현시 빌더 패턴보다 유연하고 명확해서 좋지만 개발하는데 시간이 더 소요된다.