Jak pokazują D3xter masz możliwość skonfigurowania go w konstruktorze. Masz również inne opcje. Tutaj wszyscy są ...
Tworzenie właściwość w konstruktorze (zgodnie @ D3xter) ten jest najczęstszym przypadku prostych właściwości zainicjowane bezpośrednio przez głównego konstruktora:
class TestClass(private val context: Context) {
fun doSomeVoodoo() {
val text : String = context.getString()
}
}
Możesz zadeklarować właściwość val
i nie zainicjować jej, zakładając, że wszystkie możliwe konstruktory faktycznie ją zainicjują (jak na twój drugi przykład w zadawanym pytaniu). Jest to normalne, gdy masz więcej niż jeden konstruktor, które mogłyby zainicjować wartości inaczej:
public class TestClass {
private val context: Context
public constructor(context : Context) {
this.context = context
}
// alternative constructor
public constructor(pre: PreContext) {
this.context = pre.readContext()
}
public fun doSomeVoodoo() {
val text : String = context.getString()
}
}
można przekazać w parametrów konstruktora, które nie są oświadczenia majątkowe, a następnie używać ich w ciągu inicjowania własności. Jest to powszechne, gdy masz bardziej złożone inicjacji lub trzeba użyć właściwości delegowanych:
class TestClass(context: PreContext) {
private val context : Context by lazy { context.readContext() }
private val other: List<Items> = run {
context.items.map { it.tag }.filterNotNull()
}
private val simpleThing = context.getSimple()
fun doSomeVoodoo() {
val text : String = context.getString()
}
}
Korzystanie lateinit
modifier gdy nie można zainicjować wartości w trakcie budowy, ale masz pewność, że będzie to miało miejsce przed pierwszym dostępem do odczytu. Jest to powszechne, gdy wtrysk zależność, IoC kontenera, lub coś tworzy pusty wersję swojej klasie, a następnie inicjuje go natychmiast:
class TestClass() {
private lateinit var context : Context // set by something else after construction
fun doSomeVoodoo() {
val text : String = context.getString()
}
}
Dla lateinit
nieruchomość musi obecnie być var
i nie działa z prymitywny typy.
Możesz również zadeklarować właściwość var
i nie można jej zainicjować, jeśli używasz delegata zaprojektowanego do tego celu, takiego jak Delegates.notNull()
.Jest to podobne do lateinit
i wspólne kiedy chcesz var
że nie ma stanu początkowego, ale jest ustawiona później po wybudowaniu w nieznanym momencie:
public class TestClass() {
private var context: Context by Delegates.notNull()
public fun doSomeVoodoo() {
// if context is not set before this is called, an exception is thrown
val text : String = context.getString()
}
}
Drugim przykładem jest praca z Kotlin 0.12.213. Jakiej wersji Kotlin używasz? – D3xter
To działa. Użyłem już 0.12.613. Ale myślę, że robiłem coś złego. Przepraszam! – Christopher
Jest więcej przypadków, dodałem odpowiedź dla pełnego zasięgu. –