Wenn Sie Kotlin unter Android usw. verwenden, gibt es viele Leute, die automatisch mit "Java-Datei in Kotlin-Datei konvertieren" von Java konvertieren. Es funktioniert tatsächlich, aber es ist ein Memo, um noch einen Schritt weiter zu gehen und Kotlin besser zu nutzen.
Dieses Mal lernst du Smart Cast. Kotlin-Version: 1.3
Sie könnten denken, es gäbe ein besseres Beispiel (Schweiß), aber nehmen wir an, Sie haben eine Mischung aus Java- und Kotlin-Code wie folgt:
ResponseModle.java
public class ResponseModle {
public void receiveResponseBody(ItemData data) {
if (data == null) {
return;
}
if (data.getBody() != null) {
ResponseLog.INSTANCE.showLength(data.getBody());
}
// android.text.TextUtils.isEmpty(CharSequence str)
//Kann sowohl null als auch leer prüfen
if (!TextUtils.isEmpty(data.subBody)) {
ResponseLog.INSTANCE.showSubTitle(data.getSubBody());
}
}
ItemData.java
public class ItemData {
private String body = null;
private String subBody = null;
public ItemData(String body, String subBody) {
this.body = body;
this.subBody = subBody;
}
public String getBody() {
return body;
}
public String getSubBody() {
return subBody;
}
}
ResponseLog.kt
object ResponseLog {
public fun showLength(title: String) {
System.out.print(title.length)
}
public fun showSubTitle(subTitle: String) {
System.out.print(subTitle)
}
}
Wenn dies automatisch konvertiert und an die ursprüngliche Form angepasst wird, wird es sicherlich so aussehen ...
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
if (data == null) {
return
}
if (data?.body != null) {
ResponseLog.showLength(data.body)
}
if (!TextUtils.isEmpty(data?.subBody)) {
ResponseLog.showSubTitle(data.subBody!!)
}
}
}
ItemData.kt
data class ItemData(val body: String? = null, val subBody: String? = null)
ResponseLog.kt
object ResponseLog {
public fun showLength(title: String) {
System.out.print(title.length)
}
public fun showSubTitle(subTitle: String) {
System.out.print(subTitle)
}
}
Die Implementierung der ResponseModle-Klasse ist etwas aggressiv geworden. Nullable wird durch Beurteilung entpackt (Daten? ...), obwohl die Nullprüfung von ItemData abgeschlossen ist. Nur NonNull kann als Argument der Methode der ResponseLog-Klasse übergeben werden. Erzwungenes Auspacken (... !!), um Kompilierungsfehler zu vermeiden. Ich möchte das Auspacken nicht erzwingen, da es bereits auf null geprüft wurde.
Wenn Sie Smart Cast verwenden, wird es ohne erzwungenes Auspacken kompiliert.
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
//Intelligente Besetzung
if (data !is ItemData) return
//Intelligente Besetzung
if (data.body is String) ResponseLog.showLength(data.body)
// Kotlin1.Smartcast funktioniert mit isNullOrEmpty ab 3
if (!data.subBody.isNullOrEmpty()) ResponseLog.showSubTitle(data.subBody)
}
}
Verwendet den Elvis-Operator, um ein erzwungenes Auspacken zu vermeiden ResponseLog.showSubTitle(data.subBody ?: "")
Einfache Implementierungsmethode mit let beim Zuweisen von Werten
Wenn es eine solche Implementierung gibt
ResponseModle.java
public class ResponseModle {
public void receiveResponseBody(ItemData data) {
String body;
if (data.getBody() == null) {
return;
} else {
body = "OK";
}
ResponseLog.INSTANCE.showLength(body);
}
}
Konvertieren mit Java-Datei in Kotlin-Datei konvertieren
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
val body: String
if (data?.body == null) {
return
} else {
body = "OK"
}
ResponseLog.showLength(body);
}
Es wird jedoch eine Java-ähnliche Implementierung. Wenn Sie Kotlin mit viel Aufwand verwenden, schreiben Sie einfach mit let
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
val body = data?.body?.let { "OK" } ?: return
ResponseLog.showLength(body);
}
Sehr einfach!
Recommended Posts