Kotlin constructor secundario

¿Cómo declaro un constructor secundario en Kotlin?

¿Hay alguna documentation sobre eso?

Siguiendo no comstack …

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

Solutions Collecting From Web of "Kotlin constructor secundario"

Actualización : desde M11 (0.11. *) Kotlin admite constructores secundarios .


Por ahora, Kotlin solo admite constructores primarios (los constructores secundarios pueden ser compatibles más adelante).

La mayoría de los casos de uso para constructores secundarios se resuelven mediante una de las siguientes técnicas:

Técnica 1. (resuelve su caso) Defina un método de fábrica al lado de su class

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

uso:

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

Técnica 2. (también puede ser útil) Definir valores pnetworkingeterminados para parameters

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

uso:

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

Tenga en count que los valores pnetworkingeterminados funcionan para cualquier function , no solo para los constructores

Técnica 3. (cuando necesite encapsulación) Use un método de fábrica definido en un object complementario

Algunas veces quiere que su constructor sea privado y solo un método de fábrica disponible para los clientes. Por ahora esto solo es posible con un método de fábrica definido en un object complementario :

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

uso:

 val c = C.new("foo") 

Como señala la documentation , puede usar un constructor secundario de esta manera

 class GoogleMapsRestApiClient constructor(val baseUrl: String) { constructor() : this("https://api.whatever.com/") } 

Recuerde que debe extender el primer comportamiento del constructor.

Acabo de ver esta pregunta y creo que puede haber otra técnica que suene incluso mejor que las propuestas por Andrey.

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

Que puede escribir algo como val c:C = C(3) o val c:C = C("abc") , porque los methods de invoke funcionan de la misma manera que los methods de apply funcionan en Scala.

Actualizar

A partir de ahora, los constructores secundarios ya forman parte de la especificación del idioma, por lo que esta solución alternativa no debe utilizarse.

para declarar un constructor secundario, Kotlin solo usa la palabra key constructor : como

este es un constructor primario:

 class Person constructor(firstName: String) { } 

o

 class Person(firstName: String) { } 

para el código de constructor secundario como este:

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

es obligatorio llamar al constructor primario; de lo contrario, el comstackdor lanzará el siguiente error

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

puedes probar esto

El siguiente fragment de código debería funcionar

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

Ejemplo de constructor secundario de 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") } } 

function principal

 fun main(args : Array<String>){ var objd=Person(25,"Deven") objd.display() }