Top Banner
84

Hey Kotlin, How it works?

Jan 23, 2018

Download

Engineering

Chang W. Doh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 2: Hey Kotlin, How it works?
Page 3: Hey Kotlin, How it works?
Page 4: Hey Kotlin, How it works?
Page 5: Hey Kotlin, How it works?
Page 6: Hey Kotlin, How it works?

package com.cwdoh.devfest2017

class Gugu { fun print() { for (i in 1..9) { for (j in 1..9) { print("$i * $j = ${i * j}") } } } }

Page 7: Hey Kotlin, How it works?

🤩😲😘😍

Page 8: Hey Kotlin, How it works?
Page 9: Hey Kotlin, How it works?
Page 10: Hey Kotlin, How it works?
Page 11: Hey Kotlin, How it works?

package com.cwdoh.devfest2017

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null

fun description() = "$speaker's talk: '$title' at room $room" }

Page 12: Hey Kotlin, How it works?
Page 13: Hey Kotlin, How it works?

package com.cwdoh.devfest2017

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null

fun description() = "$speaker's talk: '$title' at room $room" }

Page 14: Hey Kotlin, How it works?

class Session { var name = "cwdoh" }

public final class Session { @NotNull private String name = "cwdoh";

@NotNull public final String getName() { return this.name; }

public final void setName(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); this.name = var1; } }

Page 15: Hey Kotlin, How it works?

class Session { val name = "cwdoh" }

public final class Session { @NotNull private final String name = "cwdoh";

@NotNull public final String getName() { return this.name; } }

Page 16: Hey Kotlin, How it works?

class Session { val speaker = "cwdoh"

fun description() { val talks = "$speaker's talks" println(talks) } }

public final class Session { @NotNull private final String speaker = "cwdoh";

@NotNull public final String getSpeaker() { return this.speaker; }

public final void description() { String talks = "" + this.speaker + "'s talks"; System.out.println(talks); } }

Page 17: Hey Kotlin, How it works?
Page 18: Hey Kotlin, How it works?

package com.cwdoh.devfest2017

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null

fun description() = "$speaker's talk: '$title' at room $room" }

Page 19: Hey Kotlin, How it works?

class Session { var name: String = "cwdoh" }

public final class Session { @NotNull private String name = "cwdoh";

@NotNull public final String getName() { return this.name; }

public final void setName(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); this.name = var1; } }

public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } }

Page 20: Hey Kotlin, How it works?

class Session { fun hello(name: String) = "hello, " + name }

public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; } }

public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } }

Page 21: Hey Kotlin, How it works?

class Session { fun hello(name: String) = "hello, " + name fun print() { val name: String = "cwdoh" print(hello(name)) } }

public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; }

public final void print() { String name = "cwdoh"; String var2 = this.hello(name); System.out.print(var2); } }

Page 22: Hey Kotlin, How it works?

class Session { fun hello(name: String) = "hello, " + name

fun print() { val name: String? = null print(hello(name!!)) } }

public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; }

public final void print() { String name = (String)null; Intrinsics.throwNpe(); String var2 = this.hello(name); System.out.print(var2); } }

NullPointerException? 😎

Page 23: Hey Kotlin, How it works?
Page 24: Hey Kotlin, How it works?

package com.cwdoh.devfest2017

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null

fun description() = "$speaker's talk: '$title' at room $room" }

Page 25: Hey Kotlin, How it works?

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null

fun description() = "$speaker's talk: '$title' at room $room" }

public final class Session { @NotNull private final String speaker = "cwdoh"; @NotNull private final String title = "Kotlin: How it works"; @Nullable private Integer room;

@NotNull public final String description() { return "" + this.speaker + "'s talk: ‘" + this.title + "' at room " + this.room; } }

Page 26: Hey Kotlin, How it works?

// access flags 0x11 public final description()Ljava/lang/String; @Lorg/jetbrains/annotations/NotNull;() // invisible L0 LINENUMBER 8 L0 NEW java/lang/StringBuilder DUP INVOKESPECIAL java/lang/StringBuilder.<init> ()V LDC "" INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.speaker : Ljava/lang/String; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; LDC "'s talk: '" INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.title : Ljava/lang/String; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; LDC "' at room " INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.room : Ljava/lang/Integer; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; ARETURN

Page 27: Hey Kotlin, How it works?
Page 28: Hey Kotlin, How it works?

class NotOpenedClass open class OpenedClass

public final class NotOpenedClass { }

public class OpenedClass { }

Page 29: Hey Kotlin, How it works?

interface Interface open class OpenClass class ChildClass: OpenClass(), Interface

fun test() { val child = ChildClass() }

public final class ChildClass extends OpenClass implements Interface {}

public interface Interface {}

public class OpenClass {}

public final class SimpleClassKt { public static final void test() { new ChildClass(); } }

Page 30: Hey Kotlin, How it works?
Page 31: Hey Kotlin, How it works?

class Person1 constructor(name: String) class Person2(name: String)

public final class Person1 { public Person1(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); } }

public final class Person2 { public Person2(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); } }

Page 32: Hey Kotlin, How it works?

class Person constructor(val name: String)

public final class Person { @NotNull private final String name;

@NotNull public final String getName() { return this.name; }

public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; } }

Page 33: Hey Kotlin, How it works?

class Person constructor(val name: String) { val greetings: String init { greetings = "hello, $name” } }

public final class Person { @NotNull private String greetings; @NotNull private final String name;

@NotNull public final String getGreetings() { return this.greetings; }

@NotNull public final String getName() { return this.name; }

public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; this.greetings = "hello, " + this.name; } }

Page 34: Hey Kotlin, How it works?

class Person constructor(val name: String) { val greetings: String var age: Int = null

constructor(name: String, age: Int): this(name) { this.age = age }

init { greetings = "hello, $name” } }

public final class Person { @NotNull private final String greetings; private int age; …

public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; this.age = ((Number)null).intValue(); this.greetings = "hello, " + this.name; }

public Person(@NotNull String name, int age) { Intrinsics.checkParameterIsNotNull(name, "name"); this(name); this.age = age; } }

Page 35: Hey Kotlin, How it works?
Page 36: Hey Kotlin, How it works?

open class Parent { private val a = println("Parent.a")

constructor(arg: Unit=println("Parent primary constructor arg")) { println("Parent primary constructor") }

init { println("Parent.init") }

private val b = println("Parent.b") }

class Child : Parent { val a = println("Child.a")

init { println("Child.init 1") }

constructor(arg: Unit=println("Child primary constructor arg")) : super() { println("Child primary constructor") }

val b = println("Child.b")

constructor(arg: Int, arg2:Unit= println("Child secondary constructor arg")): this() { println("Child secondary constructor") }

init { println("Child.init 2") } }

fun main(args: Array<String>) { Child(1) }

Child secondary constructor arg Child primary constructor arg Parent primary constructor arg Parent.a Parent.init Parent.b Parent primary constructor Child.a Child.init 1 Child.b Child.init 2 Child primary constructor Child secondary constructor

Page 37: Hey Kotlin, How it works?
Page 38: Hey Kotlin, How it works?
Page 39: Hey Kotlin, How it works?

class Props { var size: Int = 0

val isEmpty: Boolean get() = this.size == 0 }

public final class Props { private int size;

public final int getSize() { return this.size; }

public final void setSize(int var1) { this.size = var1; }

public final boolean isEmpty() { return this.size == 0; } }

Page 40: Hey Kotlin, How it works?

class Props { var age: Int = 0 set(value: Int) { age = if (value < 0) 0 else value } }

public final class Props { private int age;

public final int getAge() { return this.age; }

public final void setAge(int value) { this.setAge(value < 0? 0:value); } }

Page 41: Hey Kotlin, How it works?

class Props { var age: Int = 0 private set }

public final class Props { private int age;

public final int getAge() { return this.age; }

private final void setAge(int var1) { this.age = var1; } }

Page 42: Hey Kotlin, How it works?
Page 43: Hey Kotlin, How it works?
Page 44: Hey Kotlin, How it works?

class MainActivity : AppCompatActivity() { private var mWelcomeTextView: TextView? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

mWelcomeTextView = findViewById(R.id.msgView) as TextView } }

Page 45: Hey Kotlin, How it works?

class MainActivity : AppCompatActivity() { private lateinit var mWelcomeTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

mWelcomeTextView = findViewById(R.id.msgView) as TextView } }

Page 46: Hey Kotlin, How it works?

class MainActivity : AppCompatActivity() { private val mWelcomeTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Where am I????? // mWelcomeTextView = // findViewById(R.id.msgView) as TextView } }

Page 47: Hey Kotlin, How it works?

class MainActivity : AppCompatActivity() { private val messageView : TextView by lazy { // following code will be executed at first access findViewById(R.id.message_view) as TextView }

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) }

fun onSayHello() { messageView.text = "Hello" } }

Page 48: Hey Kotlin, How it works?
Page 49: Hey Kotlin, How it works?

class Delegate { operator fun getValue( thisRef: Any?, property: KProperty<*> ): String { // do something // return value }

operator fun setValue( thisRef: Any?, property: KProperty<*>, value: String ) { // do something // assign } }

Page 50: Hey Kotlin, How it works?
Page 51: Hey Kotlin, How it works?
Page 52: Hey Kotlin, How it works?

class Demo { val myName : String by lazy { "John" } }

public final class Demo { // $FF: synthetic field static final KProperty[] $$delegatedProperties = new KProperty[]{ … };

@NotNull private final Lazy myName$delegate;

@NotNull public final String getMyName() { Lazy var1 = this.myName$delegate; KProperty var3 = $$delegatedProperties[0]; return (String)var1.getValue(); }

public Demo() { this.myName$delegate = LazyKt.lazy((Function0)null.INSTANCE); } }

Page 53: Hey Kotlin, How it works?

class Demo { val myName : String by lazy { getNameFromPreference() }} initializerdelegate

Page 54: Hey Kotlin, How it works?

myName

Lazy<T>

getValue()

{ getNameFromPreference() }initializer

class Demo { val myName : String by lazy { getNameFromPreference() }}

Page 55: Hey Kotlin, How it works?

myName

Lazy<T>

getValue() UNINITIALIZED_VALUE

{ getNameFromPreference() }initializer

class Demo { val myName : String by lazy { getNameFromPreference() }}

Page 56: Hey Kotlin, How it works?

myName

Lazy<T>

getValue() “John”

{ getNameFromPreference() }initializer

class Demo { val myName : String by lazy { getNameFromPreference() }}

Page 57: Hey Kotlin, How it works?

myName

Lazy<T>

getValue() “John”

initializer null

class Demo { val myName : String by lazy { getNameFromPreference() }}

Page 58: Hey Kotlin, How it works?

class MainActivity : AppCompatActivity() { private val messageView : TextView by lazy { // I’ll be initialized lazily at first access findViewById(R.id.message_view) as TextView }

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) }

fun onSayHello() { messageView.text = "Hello" } }

Page 59: Hey Kotlin, How it works?

val messageView: TextView by lazy { findViewById(R.id.message_view) as TextView }

property delegate

Page 60: Hey Kotlin, How it works?
Page 61: Hey Kotlin, How it works?

interface Base { fun printX() }

class BaseImpl(val x: Int) : Base { override fun printX() { print(x) } }

Page 62: Hey Kotlin, How it works?

interface A { fun hello(): String }

class B : A { override fun hello() = "Hello!!" }

class C : A by B()

Page 63: Hey Kotlin, How it works?

public interface A { @NotNull String hello(); }

public final class B implements A { @NotNull public String hello() { return "Hello!!"; } }

public final class C implements A { // $FF: synthetic field private final B $$delegate_0 = new B();

@NotNull public String hello() { return this.$$delegate_0.hello(); } }

Page 64: Hey Kotlin, How it works?
Page 65: Hey Kotlin, How it works?
Page 66: Hey Kotlin, How it works?

fun String.hello() : String { return "Hello, $this" }

fun main(args: Array<String>) { val whom = "cwdoh" println(whom.hello()) }

// Result Hello, cwdoh

Page 67: Hey Kotlin, How it works?
Page 68: Hey Kotlin, How it works?

open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun printFoo(c: C) { println(c.foo()) } class Demo { fun run() { printFoo(D()) } }

public class C {} public final class D extends C {}

public final class SimpleClassKt { @NotNull public static final String foo(@NotNull C $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return "c"; }

@NotNull public static final String foo(@NotNull D $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return "d"; }

public static final void printFoo(@NotNull C c) { Intrinsics.checkParameterIsNotNull(c, "c"); String var1 = foo(c); System.out.println(var1); } }

public final class Demo { public final void run() { SimpleClassKt.printFoo((C)(new D())); } }

Page 69: Hey Kotlin, How it works?

class Person { fun hello() { println("hello!") } }

fun Person.hello() { println(" ?!!") }

fun main(args: Array<String>) { Person().hello() }

// Result hello!

public final class Person { public final void hello() { String var1 = "hello!"; System.out.println(var1); } }

public final class SimpleClassKt { public static final void hello(@NotNull Person $receiver) { Intrinsics.checkParameterIsNotNull( $receiver, "$receiver"); String var1 = " ?!!"; System.out.println(var1); }

public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); (new Person()).hello(); } }

Page 70: Hey Kotlin, How it works?

class D { fun bar() { println("D.bar()") } }

class C { fun baz() { println("C.bar()") } fun D.foo() { bar() // calls D.bar baz() // calls C.baz } fun caller(d: D) { d.foo() } }

public final class C { public final void baz() { String var1 = "C.bar()"; System.out.println(var1); }

public final void foo(@NotNull D $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); $receiver.bar(); this.baz(); }

public final void caller(@NotNull D d) { Intrinsics.checkParameterIsNotNull(d, "d"); this.foo(d); } }

public final class D { public final void bar() { String var1 = "D.bar()"; System.out.println(var1); } }

Page 71: Hey Kotlin, How it works?
Page 72: Hey Kotlin, How it works?

data class Length(var centimeters: Int = 0)

var Length.meters: Float get() { return centimeters / 100.0f } set(meters: Float) { this.centimeters = (meters * 100.0f).toInt() }

Page 73: Hey Kotlin, How it works?

data class Length(var centimeters: Int = 0)

var Length.meters: Float get() { return centimeters / 100.0f }

set(meters: Float) { this.centimeters = (meters * 100.0f).toInt() }

public final class Length { private int centimeters; ...}

public final class ExtensionsKt { public static final float getMeters( @NotNull Length $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return (float)$receiver.getCentimeters() / 100.0F; }

public static final void setMeters( @NotNull Length $receiver, float meters) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); $receiver.setCentimeters((int)(meters * 100.0F)); }

...}

Page 74: Hey Kotlin, How it works?

fun Any?.toString(): String { if (this == null) return “null"

return toString() }

public final class SimpleClassKt { @NotNull public static final String toString(@Nullable Object $receiver) { return $receiver == null? "null":$receiver.toString(); } }

Page 75: Hey Kotlin, How it works?

fun Any?.toString(): String { println("Extension is called.") if (this == null) return "null" return toString() }

fun main(args: Array<String>) { val var1 : Any? = null println(var1.toString())

val str1 : String? = null println(str1.toString())

var str2 : String? = "hello" println(str2.toString())

var str3 : String = "world" println(str3.toString()) }

public final class SimpleClassKt { @NotNull public static final String toString(@Nullable Object $receiver) { String var1 = "Extension is called."; System.out.println(var1); return $receiver == null?"null":$receiver.toString(); }

public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, “args");

Object var1 = null; String str1 = toString(var1); System.out.println(str1);

str1 = (String)null; String str2 = toString(str1); System.out.println(str2);

str2 = "hello"; String str3 = toString(str2); System.out.println(str3);

str3 = "world"; String var5 = str3.toString(); System.out.println(var5); } }

Extension is called. null Extension is called. null Extension is called. hello world

Page 76: Hey Kotlin, How it works?
Page 77: Hey Kotlin, How it works?

fun sing() { println("We will we will rock you") println("(Sing it!)") println("We will we will rock you") }

fun beatbox() { println("pv zk bschk pv zk") }

fun ensemble() { sing() beatbox() sing() beatbox() }

public final class SimpleClassKt { public static final void sing() { String var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); }

public static final void beatbox() { String var0 = "pv zk bschk pv zk"; System.out.println(var0); }

public static final void ensemble() { sing(); beatbox(); sing(); beatbox(); } }

Page 78: Hey Kotlin, How it works?

fun sing() { println("We will we will rock you") println("(Sing it!)") println("We will we will rock you") }

fun beatbox() { println("pv zk bschk pv zk") }

fun ensemble() { sing() beatbox() sing() beatbox() }

public final class SimpleClassKt { public static final void sing() { String var1 = "We will we will rock you"; … }

public static final void beatbox() { … }

public static final void ensemble() { String var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); beatbox(); var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); beatbox(); } }

Page 79: Hey Kotlin, How it works?

fun log(message: () -> String) { println(message()) }

fun test() { log { "Lorem ipsum dolor sit amet, consectetur ..." } }

public final class SimpleClassKt { public static final void log(@NotNull Function0 message) { Intrinsics.checkParameterIsNotNull(message, "message"); Object var1 = message.invoke(); System.out.println(var1); }

public static final void test() { log((Function0)null.INSTANCE); } }

Page 80: Hey Kotlin, How it works?

inline fun trace(message: String) {}

fun doSomething() { print("I'm doing something!") trace("doSomething() is doing something!") }

public final class SimpleClassKt { public static final void trace(@NotNull String message) { Intrinsics.checkParameterIsNotNull(message, "message"); }

public static final void doSomething() { String var0 = "I'm doing something!"; System.out.print(var0); var0 = "doSomething() is doing something!"; } }

Page 81: Hey Kotlin, How it works?

inline fun log(message: () -> String) { println(message()) }

fun test() { log { "Lorem ipsum dolor sit amet, consectetur ..." } }

public final class SimpleClassKt { public static final void log(@NotNull Function0 message) { Intrinsics.checkParameterIsNotNull(message, "message"); Object var2 = message.invoke(); System.out.println(var2); }

public static final void test() { String var0 = "Lorem ipsum dolor sit amet, consectetur ..."; System.out.println(var0); } }

Page 82: Hey Kotlin, How it works?

inline fun trace(message: ()-> String) {}

fun doSomething() { trace { val receiver = "nurimaru" val sender = "cwdoh" "$sender wanna give $receiver big thank you for good tips." } }

public final class SimpleClassKt { public static final boolean isDebug() { return true; }

public static final void trace(@NotNull Function0 message) { Intrinsics.checkParameterIsNotNull(message, "message"); }

public static final void doSomething() { } }

Page 84: Hey Kotlin, How it works?