코틀린Kotlin에서 자바 인터페이스 getter 처리

문제의 getter를 포함한 UserDetails 인터페이스

interface UserDetails {
  fun getUsername(): String
}

자바에서의 처리

public class User implements UserDetails {
  @Getter
  private String username;
}

코틀린Kotlin에서의 처리

1.

class User : UserDetails {
  constructor(username:String){
    this.username = username
  }
  override fun getUsername() = username
  val username: String = getUsername
  @JvmName("getUsername_") get() = username
}

2.

class User : UserDetails {
  constructor(username: String){
    this.username = username  
  }
  private val username: String
  override fun getUsername() = username
}

3. 이게 제일 깔끔하고 알아보기 편하다.

class User(val username: String) : UserDetails {
  override fun getUsername() = username
}

상황에 따라 1,2번을 써야하는 경우가 있기는 할까