Вторичный конструктор Котлина
как объявить вторичный конструктор в Kotlin?
есть ли какие-либо документы об этом?
следующий не компилируется...
class C(a : Int) {
// Secondary constructor
this(s : String) : this(s.length) { ... }
}
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() }