Вторичный конструктор Котлина


как объявить вторичный конструктор в Kotlin?

есть ли какие-либо документы об этом?

следующий не компилируется...

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

8 ответов:

обновление: Начиная С M11 (0.11.* ) Котлин поддерживает вторичный конструкторы.


на данный момент 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/")

}

помните, что вы должны расширить первое поведение конструктора.

для объявления вторичного конструктора Котлин просто использовать конструктор ключевое слово: как

это основной конструктор:

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

Я только что видел этот вопрос, и я думаю, что может быть другая техника, которая звучит даже лучше, чем те, которые предложил Андрей.

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

что вы можете либо написать что-то вроде val c:C = C(3) или val c:C = C("abc"), потому что invoke методы работают примерно так же, как apply методы работы в Scala.

обновление

на данный момент вторичные конструкторы уже являются частью спецификации языка, поэтому этот обходной путь не должен использоваться.

вы можете определить несколько конструкторов в Котлин с 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)

}

Подробнее смотрите здесь

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

вы можете попробовать это.

приведенный ниже фрагмент кода должен работать

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

пример вторичного конструктора kotlin

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")
    }
}

основные функции

fun main(args : Array<String>){

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