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(
url, windowName, params)
}
}
}
이렇게 해두면 java 에서 kotlin 코드를 호출 시 동일하게 사용할 수 있으므로 코드 호환성이 보장 되며 코드양도 좀 줄어드는 효과는 있다.
끝.