Lors de l'utilisation de Kotlin sur Android, etc., de nombreuses personnes effectuent une conversion automatique de Java avec "Convertir un fichier Java en fichier Kotlin". Cela fonctionne réellement, mais c'est un mémo pour aller plus loin et mieux utiliser Kotlin.
Cette fois, vous apprendrez la distribution intelligente. Version Kotlin: 1.3
Vous pourriez penser qu'il y avait un meilleur échantillon (transpiration), mais supposons que vous ayez un mélange de code Java et Kotlin comme celui-ci:
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)
//Peut vérifier à la fois nul ou vide
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)
}
}
Si cela est automatiquement converti et mis en correspondance avec la forme d'origine, il ressemblera sûrement à ceci ...
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)
}
}
L'implémentation de la classe ResponseModle est devenue une implémentation plutôt agressive. Nullable est déballé (données? ...) par jugement même si la vérification nulle de ItemData est terminée. Seul NonNull peut être passé comme argument de la méthode de la classe ResponseLog. Développer forcé (... !!) pour éviter les erreurs de compilation. Je ne veux pas forcer le déballage car il a déjà été vérifié pour null.
Si vous utilisez Smart Cast, il se compilera sans déballage forcé.
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
//Fonte intelligente
if (data !is ItemData) return
//Fonte intelligente
if (data.body is String) ResponseLog.showLength(data.body)
// Kotlin1.Smartcast fonctionne avec isNullOrEmpty à partir de 3
if (!data.subBody.isNullOrEmpty()) ResponseLog.showSubTitle(data.subBody)
}
}
Utilise l'opérateur Elvis pour éviter le déballage forcé ResponseLog.showSubTitle(data.subBody ?: "")
Méthode d'implémentation simple utilisant let lors de l'attribution de valeurs
S'il existe une telle implémentation
ResponseModle.java
public class ResponseModle {
public void receiveResponseBody(ItemData data) {
String body;
if (data.getBody() == null) {
return;
} else {
body = "OK";
}
ResponseLog.INSTANCE.showLength(body);
}
}
Convertir avec Convertir un fichier Java en fichier Kotlin
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
val body: String
if (data?.body == null) {
return
} else {
body = "OK"
}
ResponseLog.showLength(body);
}
Cependant, cela devient une implémentation de type Java. Si vous utilisez Kotlin avec beaucoup d'efforts, écrivez simplement en utilisant let
ResponseModle.kt
class ResponseModle {
fun receiveResponceBody(data: ItemData?) {
val body = data?.body?.let { "OK" } ?: return
ResponseLog.showLength(body);
}
Très simple!
Recommended Posts