Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading content…
Loading…
Transcript

Nullbiztonság Kotlinban

Helyettesítsük a Javaszerű kódot biztonságos és tömör kóddal

fun main() {

sendMessageToClient(

Client(PersonalInfo(null)),//"John@Company.com")),

null,//"Wellcome ",

ConsoleMailer()

)

}

class Client(val personalInfo: PersonalInfo?)

class PersonalInfo(val email: String?)

interface Mailer {

fun sendMessage(email: String, message: String)

}

class ConsoleMailer : Mailer {

override fun sendMessage(email: String, message: String) {

println("Message to: $email\n$message")

}

}

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email = client?.personalInfo?.email

email?.let { mailer.sendMessage(it, message ?: "No message") }

}

Nullability [1]

  • A Kotlin típusrendszerének jellemzője
  • Segít elkerülni a NullPointerException hibákat
  • A típusrendszer részeként támogatja a nullabilitást
  • A null referencia problémákat futási idejűből fordítási idejű hibává konvertálja

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

if (client == null message == null) return

val personalInfo = client.personalInfo

if (personalInfo == null) return

val email = personalInfo.email

if (email == null) return

mailer.sendMessage(email, message)

}

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email = client?.personalInfo?.email

email?.let { mailer.sendMessage(it, message ?: "No message") }

}

Nullable típusok

Bármely típus után írt kérdőjel azt jelenti, hogy az ilyen típusú változók hivatkozhatnak null-ra.

Kérdőjel nélküli típus nem hivatkozhat null-ra.

Így az össze reguláris típus alapértelmezetten nem-null.

Nullable típusok

message lehet null

mailer nem lehet null

client lehet null

client: Client?, message: String?, mailer: Mailer

fun main() {

sendMessageToClient(

Client(PersonalInfo(email=null)),

message=null,

mailer = null

)

}

Error:(5, 18) Kotlin: Null can not be a value of a non-null type Mailer

Biztonságos hívás: “?.”

Magában foglalja a null ellenőrzést és a metódushívást

Az ilyen hívások visszetérési értéke lehet null

Biztonságos hívás

?.

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

if (client == null message == null) return

val personalInfo = client.personalInfo

if (personalInfo == null) return

val email = personalInfo.email

if (email == null) return

mailer.sendMessage(email, message)

}

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email=client?.personalInfo?.email

if (email == null message==null) return

mailer.sendMessage(email,message)

}

Elvis operátor: “?:”

Null-coalescing operator (Nullhoz értéket rendelő operátor)

Alapértelmezett értéket ad a null helyett

Két operandusa van, az értéke:

  • az első operandus, ha az nem null
  • a második operandus, ha az első null

Elvis operátor

?:

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email=client?.personalInfo?.email

if (email == null message==null) return

mailer.sendMessage(email,message)

}

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email=client?.personalInfo?.email

if (email == null ) return

mailer.sendMessage(email,message ?: "No message")

}

A “let” függvény

Meghívja a függvényt az adott argumentummal, mint paraméterrel, ha az nem null, különben nem történik semmi.

A leggyakrabban akkor használják, amikor egy függvény paramétere nem lehet null, de az átadni kívánt argumentum lehet.

email!=null

mailer.sendMessage(email,..)

email?.let {

mailer.sendMessage(email,..) }

A let függvény

Nothing happens

email==null

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email=client?.personalInfo?.email

email?.let {

mailer.sendMessage(email, message ?: "No message") }

}

fun sendMessageToClient(

client: Client?, message: String?, mailer: Mailer) {

val email=client?.personalInfo?.email

if (email == null ) return

mailer.sendMessage(email,message ?: "No message")

}

Az "email" argumentum helyettesíthető az "it"-tel

email?.let { mailer.sendMessage(it, message ?: "No message") }

Ennek megértéséhez a lambda kifejezések ismerete szükséges.

A prezentálció az Óbudai Egyetem

"Android fejlesztés Kotlin nyelven" kurzusához készült.

Szerző: Erdélyi Krisztina

Impresszum

Források:

[1] D. Jemerov, S. Isakova: Kotlin in Action, Manning, 6. fejezet letölthető:

https://livebook.manning.com/book/kotlin-in-action/chapter-6/

[2] https://play.kotlinlang.org/koans/Introduction/Nullable%20types/Task.kt

Learn more about creating dynamic, engaging presentations with Prezi