Kotlin nullsafety

Nullable types

El error del billon de dolares

  1. La idea es generar los NPE en tiempo

    de compilación y no en tiempo de ejecución


fun main(){

    val s1: String = "Nunca soy null"

    println(s1)

}
  1. Y si soy null?

fun main(){

    val s1: String = null

    println(s1)

}
  1. Para esto tenemos los tipos Nulables

fun main(){

    val s2: String? = "Puedo ser null y también puedo ser String"

    println(s2)

}
  1. Y que pasa si soy null

fun main(){

    val s2: String? = null

    println(s2)

}

Checking for null in conditions

  1. Chequear null con una condición

fun main(){

    val s: String? = null



    val length = if (s != null) s.length else null



    println(length)

}

Safe Calls

  1. La segunda opción es usar el Safe Call operator ?.

fun main(){

    val s: String? = null

    val length  = s?.length

    println(length)

}
  1. Asignando un valor

fun main(){

    val s: String? = null

    val length  = s?.length ?: 0

    println(length)

}
  1. ¿ Que estamos imprimiento aquí ?

fun main(){

val a: Int? = null 

val b: Int? = 1 

val c: Int = 2



val s1 = (a ?: 0) + c 

val s2 = (b ?: 0) + c 

print("$s1$s2")

}
  1. ¿ Qué va a pasar ?

class Name{

    val value :String = ""

}

fun isFoo1(n: Name) = n.value == "foo"

//fun isFoo2(n: Name?) = n.value == "foo"

//fun isFoo3(n: Name?) = n != null && n.value == "foo"

//fun isFoo4(n: Name?) = n?.value == "foo"



fun main(args: Array<String>) {

    isFoo1(null)

    //isFoo2(null)

    //isFoo3(null)

    //isFoo4(null)

}
  1. ¿ Qué va a pasar ?

class Name{

    val value :String = ""

}

//fun isFoo1(n: Name) = n.value == "foo"

fun isFoo2(n: Name?) = n.value == "foo"

//fun isFoo3(n: Name?) = n != null && n.value == "foo"

//fun isFoo4(n: Name?) = n?.value == "foo"



fun main(args: Array<String>) {

    //isFoo1(null)

    isFoo2(null)

    //isFoo3(null)

    //isFoo4(null)

}
  1. ¿ Qué va a pasar ?

class Name{

    val value :String = "foo"

}

//fun isFoo1(n: Name) = n.value == "foo"

//fun isFoo2(n: Name?) = n.value == "foo"

fun isFoo3(n: Name?) = n != null && n.value == "foo"

//fun isFoo4(n: Name?) = n?.value == "foo"



fun main(args: Array<String>) {

    //isFoo1(null)

    //isFoo2(null)

    println(isFoo3(Name()))

    //isFoo4(null)

}
  1. ¿ Qué va a pasar ?

class Name{

    val value :String = "foo"

}

//fun isFoo1(n: Name) = n.value == "foo"

//fun isFoo2(n: Name?) = n.value == "foo"

//fun isFoo3(n: Name?) = n != null && n.value == "foo"

fun isFoo4(n: Name?) = n?.value == "foo"



fun main(args: Array<String>) {

    //isFoo1(null)

    //isFoo2(null)

    //println(isFoo3(Name()))

    println(isFoo4(null))

}
  1. ¿ Que se va a imprimir ?

fun main(){

    val x: Int? = 1

    val y: Int = 2

    val sum = x ?: 0 + y

    println(sum)

}
## Referencias

* [Kotlin for java developers](https://www.coursera.org/learn/kotlin-for-java-developers)
* [https://kotlinlang.org/](https://kotlinlang.org/)