code

Kotlin 보조 생성자

codestyles 2020. 9. 12. 10:04
반응형

Kotlin 보조 생성자


Kotlin에서 보조 생성자를 어떻게 선언하나요?

그것에 대한 문서가 있습니까?

다음은 컴파일되지 않습니다 ...

class C(a : Int) {
  // Secondary constructor
  this(s : String) : this(s.length) { ... }
}

업데이트 : M11 (0.11. *) 이후 Kotlin은 보조 생성자를 지원합니다 .


현재 Kotlin은 기본 생성자 만 지원합니다 (보조 생성자는 나중에 지원 될 수 있음).

보조 생성자에 대한 대부분의 사용 사례는 아래 기술 중 하나로 해결됩니다.

기법 1. (문제 해결) 클래스 옆에 팩토리 메소드 정의

fun C(s: String) = C(s.length)
class C(a: Int) { ... }

용법:

val c1 = C(1) // constructor
val c2 = C("str") // factory method

기법 2. (유용 할 수도 있음) 매개 변수에 대한 기본값 정의

class C(name: String? = null) {...}

용법:

val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used

기본값 은 생성자뿐만 아니라 모든 함수 에서 작동합니다.

기법 3. (캡슐화가 필요한 경우) 컴패니언 객체에 정의 된 팩토리 메소드 사용

때로는 생성자를 비공개로하고 클라이언트가 사용할 수있는 팩토리 메서드 만 원합니다. 지금은 컴패니언 객체에 정의 된 팩토리 메서드에서만 가능 합니다 .

class C private (s: Int) {
    companion object {
        fun new(s: String) = C(s.length)
    }
}

용법:

val c = C.new("foo")

설명서가 가리키는 것처럼 이 방법으로 보조 생성자를 사용할 수 있습니다.

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

    constructor() : this("https://api.whatever.com/")

}

첫 번째 생성자 동작을 확장해야합니다.


보조 생성자 Kotlin 을 선언 하려면 생성자 키워드를 사용하십시오 .

이것은 기본 생성자입니다.

class Person constructor(firstName: String) {

}

또는

class Person(firstName: String) {

}

다음과 같은 보조 생성자 코드 :

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

기본 생성자 를 호출해야합니다. 그렇지 않으면 컴파일러 에서 다음 오류가 발생합니다.

Primary constructor call expected

생성자 init:

class PhoneWatcher : TextWatcher {

    private val editText: EditText
    private val mask: String

    private var variable1: Boolean = false
    private var variable2: Boolean = false

    init {
        variable1 = false
        variable2 = false
    }

    constructor(editText: EditText) : this(editText, "##-###-###-####")

    constructor(editText: EditText, mask: String) {
        this.editText = editText
        this.mask = mask
    }
    ...
}

You can define multiple constructors in Kotlin with constructor but you need to skip default constructor class AuthLog(_data: String)

class AuthLog {

    constructor(_data: String): this(_data, -1)

    constructor(_numberOfData: Int): this("From count ", _numberOfData)

    private constructor(_data: String, _numberOfData: Int)

}

For more details see here

Update

Now you can define default constructor

class AuthLog(_data: String, _numberOfData: Int) {

    constructor(_data: String): this(_data, -1) {
        //TODO: Add some code here if you want
    }

    constructor(_numberOfData: Int): this("From count", _numberOfData)

}

I just saw this question and I think there may be another technique which sounds even better than those proposed by Andrey.

class C(a: Int) {
    class object {
        fun invoke(name: String) = C(name.length)
    }        
}

That you can either write something like val c:C = C(3) or val c:C = C("abc"), because the invoke methods work kind of the same way the apply methods work in Scala.

Update

As of now, secondary constructors are already part of the language spec so this workaround shouldn't be used.


class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

you can try this.


The code snippet below should work

class  C(a:Int){
  constructor(s:String):this(s.length){..}
}

kotlin Secondary constructor example

class Person(name: String){
    var name=""
    var age=0

    constructor(age :Int,name : String)  : this(name){
        this.age=age
        this.name=name
    }
    fun display(){
        print("Kotlin Secondary constructor $name  , $age")
    }
}

main function

fun main(args : Array<String>){

    var objd=Person(25,"Deven")
    objd.display()
}

I was a bit confused with most of the answers. To make it easy to understand I am adding an example with more elements :

   @JsonInclude(JsonInclude.Include.NON_NULL)
   data class Response(val code: String) {
      var description: String? = null
      var value: String? = null

      constructor(code: String, description: String?) : this(code) {
          this.description = description
      }

      constructor(code: String, description: String?, value: String) : this(code, description) {
          this.value = value
      }
   }

참고URL : https://stackoverflow.com/questions/19299525/kotlin-secondary-constructor

반응형