Вторичный конструктор Котлина - программирование
Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

Обновить: Поскольку M11 (0.11. *), Kotlin поддерживает вторичные конструкторы.


Теперь Kotlin поддерживает только первичные конструкторы (вторичные конструкторы могут поддерживаться позже).

Большинство вариантов использования для вторичных конструкторов решаются одним из следующих способов:

Техника 1. (решает ваш случай) Определите метод factory рядом со своим классом

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. (когда вам нужна инкапсуляция) Используйте метод factory, определенный в объекте-компаньоне

Иногда вам нужен ваш конструктор private и только метод factory, доступный для клиентов. Пока это возможно только с помощью метода factory, определенного в компаньонном объекте:

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

использование:

val c = C.new("foo")

Ответ 2

В качестве пунктов документации вы можете использовать вспомогательный конструктор таким образом

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

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

}

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

Ответ 3

для объявления вторичного конструктора 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

Ответ 4

Конструкторы с 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
    }
    ...
}

Ответ 5

Вы можете определить несколько конструкторов в Kotlin с помощью constructor но вам нужно пропустить class AuthLog(_data: String) конструктора по умолчанию 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 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)

}

Ответ 6

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

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.

Обновление

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Я был немного смущен большинством ответов. Чтобы было легче понять, я добавляю пример с большим количеством элементов:

   @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
      }
   }