Be More Productive with Kotlin

  • View
    88

  • Download
    4

Embed Size (px)

Transcript

  • Being More Productive with KotlinBrandon Wever

  • Who am I? Mobile Developer at Atomic Robot

    (Android/iOS)

    Graduated from NKU with Masters in

    Computer Science Dec 2016

    I like hoppy beer and spicy wings

  • What is Kotlin?

    Kotlin is a statically typed programming language for the JVM, Android, and for the browser

    Kotlin has 100% interoperability with Java

    Created by JetBrains for internal projects and open sourced in 2012

  • Motivation behind Kotlin

    Kotlin is a pragmatic programming language for JVM and Android that combines Object oriented and functional features and is focused on interoperability, safety, clarity and tooling support

    Kotlin works everywhere Java works

  • Big Companies Using Kotlin

  • What are Developers Saying?Its really incredible how much we can pare down without sacrificing readability - Christina Lee, Pintrest (https://youtu.be/xRDqDe4rxkM)

    A data point (for Android devs who are Kotlin-curious): @trello is happily using @kotlin in production nowadays - Dan Lew, Trello (https://twitter.com/danlew42/status/809065097339564032)

    Kotlin makes writing math code almost as nice as C++. Properties and operator overloading offers many possibilities for swizzling & slicing - Romain Guy, Google (https://twitter.com/romainguy/status/812454073232453632)

    Today with IntelliJs help I upgraded Rounds from Java to Kotlin. It took 12 hours to go from 5395 lines of .java to 4924 lines of .kt - Jesse Wilson, Square (https://twitter.com/jessewilson/status/803122976321400834)

  • What I want this presentation to be

    I want you to consider trying Kotlin if you havent used it

    I want you to use Kotlin more if you have used it

    I want you to find out things Kotlin can do better

    I want you to find out better ways to do things in Kotlin

  • What I dont want this presentation to be

    A religious war

  • Getting Started

    After installing Kotlin, using a Intellij IDEA or Android Studio with an existing Java project configuring Kotlin is as easy as telling your IDE to Configure Kotlin

    Bring up the action On Mac: Cmd-Shift-A On Windows: Ctrl-Shift-A

    Begin typing Configure Kotlin

  • Getting Started

  • Getting Started

    The easiest way to get started writing Kotlin is to convert Java Code.

    Luckily IntelliJ can do that for us as well.

    Bring up the action menu and begin typing Convert Java to Kotlin

  • Getting Started

  • Getting Started

  • Getting Started

  • Things I Really Like

  • 1. Nullability as a TypeJava:

    String str = "test"; str = null;str.length();

  • 1. Nullability as a Type

    Kotlin allows you to show when Objects can or cannot be null with a ? following the type

    Nullable: var str: String?

    Never Null: var str: String

  • 1. Nullability as a Type

    This type safety turns NullPointerExceptions from Runtime Exceptions and Crashes to Compiler errors

  • 2. Safe Calls

    var str: String? = "test"str = nullstr?.length()

  • 2. Safe Calls

    Turns this Java Pattern:

    if (outer.inner != null) { if (outer.inner.deepInner != null) { outer.inner.deepInner.doSomething(); } }

    Into this concise Kotlin code:outer.inner?.deepInner?.doSomething()

  • 3. Data Classes

    Lets make a simple Java Object for a server response

    public class ServerResponse { private String message; private int statusCode; private String body; }

  • 3. Data Classespublic class ServerResponse { private String message; private int statusCode; private String body; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } }

    Now lets add our getters and setters

  • 3. Data Classespublic class ServerResponse { private String message; private int statusCode; private String body; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServerResponse that = (ServerResponse) o; if (statusCode != that.statusCode) return false; if (message != null ? !message.equals(that.message) : that.message != null) return false; return body != null ? body.equals(that.body) : that.body == null; } @Override public int hashCode() { int result = message != null ? message.hashCode() : 0; result = 31 * result + statusCode; result = 31 * result + (body != null ? body.hashCode() : 0); return result; } }

    How about .equals() and .hashCode()?

  • 3. Data Classespublic class ServerResponse { private String message; private int statusCode; private String body; public ServerResponse(String message, int statusCode, String body) { this.message = message; this.statusCode = statusCode; this.body = body; } public class ServerResponseBuilder { private String message; private int statusCode; private String body; public ServerResponseBuilder setMessage(String message) { this.message = message; return this; } public ServerResponseBuilder setStatusCode(int statusCode) { this.statusCode = statusCode; return this; } public ServerResponseBuilder setBody(String body) { this.body = body; return this; } public ServerResponse createServerResponse() { return new ServerResponse(message, statusCode, body); } } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServerResponse that = (ServerResponse) o; if (statusCode != that.statusCode) return false; if (message != null ? !message.equals(that.message) : that.message != null) return false; return body != null ? body.equals(that.body) : that.body == null; } @Override public int hashCode() { int result = message != null ? message.hashCode() : 0; result = 31 * result + statusCode; result = 31 * result + (body != null ? body.hashCode() : 0); return result; } @Override public String toString() { return "ServerResponse{" + "message='" + message + '\'' + ", statusCode=" + statusCode + ", body='" + body + '\'' + '}'; } }

    How about a Builder just for fun?

  • 3. Data Classes

    Do we really need 90+ lines of code for a POJO with 3 properties?

    What if we need to add more properties?

    Other projects such as Googles AutoValue will solve this with annotations, but Kotlin has a built in type to help this all too common problem

  • 3. Data Classesdata class ServerResponse(var message: String?, var statusCode: Int, var body: String?) { }

    Yep, thats it.

    You get .hashCode(), .equals(), and .toString() for free, as well as generated getters and setters from Java code

  • 3. Data Classes - Proof!

    https://gist.github.com/weverb2/9a4a7bccffe4d4b3bdd99f9153e1b00c

    https://gist.github.com/weverb2/9a4a7bccffe4d4b3bdd99f9153e1b00c

  • 3. Data Classes

    And what about the Builder?

    Well see that next :D

  • 4. Named and Default ParamsChanging our data class to the following will allow some cool stuff: data class ServerResponse(var message: String = "Success", var statusCode: Int = 200, var body: String = "Body") { }

    This will allow us to create a ServerResponse object like so: var serverResponse = ServerResponse()

    This will create a ServerResponse with the default values we defined in our constructor

  • 4. Named and Default Params

    Lets do something more interesting than a default constructor.

    var serverResponse = ServerResponse() var copy = serverResponse.copy() // Deep Copy!

    With data classes we just got a deep copy for free! But what if we want to change something?

    var serverResponse = ServerResponse() var changed = serverResponse.copy(statusCode = 404, message = "Not Found) // :D

    Awesome! We get a basic .toBuilder() implementation as well!

  • 4. Named and Default ParamsJava Interop Tip!

    If you annotate a Kotl