Kotlin
Redewendungen
Suche…
Erstellen von DTOs (POJOs / POCOs)
Datenklassen in Kotlin sind Klassen, die nur zum Halten von Daten erstellt wurden. Solche Klassen werden als data
markiert:
data class User(var firstname: String, var lastname: String, var age: Int)
Der obige Code erstellt eine User
Klasse mit der folgenden automatischen Generierung:
- Getter und Setter für alle Eigenschaften (Getter nur für
val
) -
equals()
-
hashcode()
-
toString()
-
copy()
-
componentN()
(wobeiN
die entsprechende Eigenschaft in der Reihenfolge der Deklaration ist)
Wie bei einer Funktion können auch Standardwerte angegeben werden:
data class User(var firstname: String = "Joe", var lastname: String = "Bloggs", var age: Int = 20)
Weitere Details finden Sie hier Datenklassen .
Eine Liste filtern
val list = listOf(1,2,3,4,5,6)
//filter out even numbers
val even = list.filter { it % 2 == 0 }
println(even) //returns [2,4]
Delegieren Sie an eine Klasse, ohne diese im öffentlichen Konstruktor anzugeben
Angenommen, Sie möchten an eine Klasse delegieren, aber die an Klasse delegierte Klasse nicht im Konstruktorparameter angeben. Stattdessen möchten Sie es privat konstruieren, sodass der Konstruktor-Aufrufer es nicht bemerkt. Zunächst erscheint dies möglicherweise als unmöglich, da die Delegierung von Klassen nur die Übergabe an Konstruktorparameter zulässt. Es gibt jedoch eine Möglichkeit, wie in dieser Antwort beschrieben :
class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {
constructor() : this(TreeBasedTable.create()) // or a different type of table if desired
}
Damit können Sie den Konstruktor von MyTable
einfach so aufrufen: MyTable()
. Die Table<Int, Int, Int>
für die die MyTable
Delegaten privat erstellt werden. Konstrukteur Anrufer weiß nichts davon.
Dieses Beispiel basiert auf dieser SO-Frage .
Serializable und serialVersionUid in Kotlin
Um die serialVersionUID
für eine Klasse in Kotlin zu erstellen, serialVersionUID
Ihnen einige Optionen zur Verfügung, die alle das Hinzufügen eines Members zum Companion-Objekt der Klasse umfassen.
Der prägnanteste Bytecode stammt aus einem private const val
von private const val
, der in der MySpecialCase
Klasse eine private statische Variable wird, in diesem Fall MySpecialCase
:
class MySpecialCase : Serializable {
companion object {
private const val serialVersionUID: Long = 123
}
}
Sie können diese Formulare auch verwenden, wobei es jeweils einen Nebeneffekt auf Getter / Setter-Methoden gibt, die für die Serialisierung nicht erforderlich sind.
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
Dadurch wird das statische Feld erstellt, es wird jedoch auch ein Getter für getSerialVersionUID
für das Begleitobjekt erstellt, was nicht getSerialVersionUID
ist.
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
Dadurch wird das statische Feld erstellt, aber auch ein statischer Getter für getSerialVersionUID
für die enthaltende Klasse MySpecialCase
. MySpecialCase
ist nicht MySpecialCase
.
Alle funktionieren jedoch als Methode zum Hinzufügen der serialVersionUID
zu einer Serializable
Klasse.
Fließende Methoden in Kotlin
Fließende Methoden in Kotlin können mit Java identisch sein:
fun doSomething() {
someOtherAction()
return this
}
Sie können sie jedoch auch funktionaler machen, indem Sie eine Erweiterungsfunktion erstellen, z.
fun <T: Any> T.fluently(func: ()->Unit): T {
func()
return this
}
Das erlaubt dann offensichtlich offensichtlich fließende Funktionen:
fun doSomething() {
return fluently { someOtherAction() }
}
Verwenden Sie let oder auch, um die Arbeit mit nullfähigen Objekten zu vereinfachen
let
in Kotlin wird aus dem Objekt, zu dem es aufgerufen wurde, eine lokale Bindung erstellt. Beispiel:
val str = "foo"
str.let {
println(it) // it
}
Dadurch wird "foo"
gedruckt und Unit
.
Der Unterschied zwischen let
und also
ist , dass Sie einen beliebigen Wert von einer zurückgeben kann let
Block. also
in der anderen Hand wird die Unit
immer reutrn.
Warum ist das nützlich, fragen Sie? Denn wenn Sie eine Methode aufrufen, die null
und Sie nur Code ausführen möchten, wenn der Rückgabewert nicht null
, können Sie let
oder also
so verwenden:
val str: String? = someFun()
str?.let {
println(it)
}
Dieser Code führt den let
Block nur aus let
wenn str
nicht null
. Beachten Sie den null
Sicherheitsoperator ( ?
).
Verwenden Sie "Apply", um Objekte zu initialisieren oder eine Methodenverkettung zu erreichen
Die Dokumentation von apply
lautet wie folgt:
ruft den angegebenen Funktionsblock mit
this
Wert als Empfänger auf und gibtthis
Wert zurück.
Während das kdoc nicht so hilfreich ist apply
ist das Anwenden tatsächlich eine nützliche Funktion. In den Begriffen von layman gilt apply
, in welchem Umfang this
an das Objekt gebunden ist, für das Sie apply
. Auf diese Weise können Sie Code sparen, wenn Sie mehrere Methoden für ein Objekt aufrufen müssen, die Sie später zurückgeben. Beispiel:
File(dir).apply { mkdirs() }
Dies ist das gleiche wie das Schreiben:
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}