본문 바로가기

Android

kotlin 그리고 java builder 패턴

java 에선 매우 유용하던 builder 패턴이 kotlin 으로 넘어가면서 다소 계륵이 된듯한 느낌이지만 어찌되었던 간에 kotlin + java 의 상황에서는 신규로 만드는 kotlin 코드에서도 java 에서 builder 패턴 으로 호출 할 수 있도록 작업이 필요하다. 
물론 순수 kotlin 으로만 되어 있다면 data class 에 apply 만 이용하면 비슷한 효과를 얻을 수있으므로 필요 없는 작업이 되겠지만 기존의 프로젝트의 경우 java 와 섞여 있으니 =_ = 해야 된다. 
 
가령 기존의 java 코드가 아래와 같았다면 
 
final class WindowDelegateParams {
    public final String url;
    public final String windowName;
    public final String[] params;
 
    private WindowDelegateParams(final Builder builder) {
        url         = builder.mUrl;
        windowName  = builder.mWindowName;
        params      = builder.mParams;
    }
 
    public static Builder builder() {
        return new Builder();
    }
 
    public final static class Builder {
        private String mUrl;
        private String mWindowName = "defaultWebWindow";
        private String[] mParams;
 
        private Builder() {
 
        }
 
        public Builder windowName(@NonNull final String windowName) {
            this.mWindowName = windowName;
            return this;
        }
 
        public Builder params(@NonNull final String[] params) {
            this.mParams = params;
            return this;
        }
 
        public Builder url(@NonNull final String url) {
            this.mUrl = url;
            return this;
        }
 
        public WindowDelegateParams build() {
            return new WindowDelegateParams(this);
        }
    }
}
 
kotlin 에서는 아래와 같이 변환할 수 있다 .
 
data class WindowDelegateParams(
    val url: String?,
    val windowName: String,
    val params: Array<String>?
) {
    companion object {
        @JvmStatic
        fun builder() = Builder()
 
        class Builder {
            private var url: String?            = null
            private var windowName: String      = "defaultWebWindow"
            private var params: Array<String>?  = null
 
            fun url(url: String) = apply {
                this.url = url
            }
 
            fun windowName(name: String) = apply {
                this.windowName = name
            }
 
            fun params(params: Array) = apply {
                this.params = params
            }
 
            fun build() = WindowDelegateParams(
                    urlwindowName, params)
        }
    }
}

이렇게 해두면 java 에서 kotlin 코드를 호출 시 동일하게 사용할 수 있으므로 코드 호환성이 보장 되며 코드양도 좀 줄어드는 효과는 있다. 
 
끝.