Как объявить вторичный конструктор в Котлине?
Есть ли какая-либо документация об этом?
Следующее не компилируется...
class C(a : Int) {
// Secondary constructor
this(s : String) : this(s.length) { ... }
}
Как объявить вторичный конструктор в Котлине?
Есть ли какая-либо документация об этом?
Следующее не компилируется...
class C(a : Int) {
// Secondary constructor
this(s : String) : this(s.length) { ... }
}
Обновить: Поскольку 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")
В качестве пунктов документации вы можете использовать вспомогательный конструктор таким образом
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
}
...
}
Вы можете определить несколько конструкторов в 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)
}
Я только что увидел этот вопрос, и я думаю, что может быть другая техника, которая звучит даже лучше, чем те, которые предложил Андрей.
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.
Обновление
В настоящее время вторичные конструкторы уже являются частью спецификации языка, поэтому это обходное решение не должно использоваться.
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()
}
Я был немного смущен большинством ответов. Чтобы было легче понять, я добавляю пример с большим количеством элементов:
@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
}
}