spreadshirt philipp hauer, fabian sudau · → immutability feels defaultish, encourages better...
TRANSCRIPT
![Page 1: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/1.jpg)
Spreadshirt
Kotlin in PracticePhilipp Hauer, Fabian Sudau
Spreadshirt
JUG Saxony Camp 2017
![Page 2: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/2.jpg)
Spreadshirt 2
Spreadshirt
![Page 3: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/3.jpg)
Spreadshirt
Hands Up!
![Page 4: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/4.jpg)
Spreadshirt
Introduction
![Page 5: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/5.jpg)
Spreadshirt
Introduction: Java Ecosystem and Language
Powerful Ecosystem Poor Language
5
Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
![Page 6: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/6.jpg)
Spreadshirt
Introduction: Java Ecosystem and Language
Powerful Ecosystem Powerful Language
6
Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
![Page 7: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/7.jpg)
Spreadshirt
Ecosystem vs. Language
7
![Page 8: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/8.jpg)
Spreadshirt
Introduction: Kotlin
• By JetBrains• 2011• Open-Source• Characteristics:
▪ Statically Typed▪ Object-Oriented▪ Many Functional Concepts
8
• Compiled to Java Bytecode• Runs on the Java Virtual Machine (JVM)• “Pragmatic”
![Page 9: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/9.jpg)
Spreadshirt
Language Features
![Page 10: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/10.jpg)
Spreadshirt
Language Features: Immutability
Support for immutability built-in
// mutable state - use rarelyvar mutableList = mutableListOf(1, 2, 3)mutableList.add(4)
10
// ‘immutable’ state - generally recommendedval readonlyList = listOf(1, 2, 3)readonlyList.add(4)readonlyList = listOf(1, 2, 3, 4)
→ Immutability feels defaultish, encourages better design→ Still 100% Java compatible due to interface-based approach
![Page 11: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/11.jpg)
Spreadshirt
Language Features: Data Classes
Concise Data Containers
// implies sensible defaults for equals(...), hashCode(), toString()data class Person(val firstName: String, var age: Int, val title: Title = Title.UNKNOWN)
11
val jon = Person(firstName = "Jon", age = 18, title = Title.MR)val defaultJon = Person(firstName = "Jon", age = 18)val jack = jon.copy(firstName = "Jack")
println(jack.firstName) // prints ‘Jack’jack.age = 19 // assignment of varjack.firstName = "Joseph" // illegal, field is immutable
→ Plain Java equivalent requires 91 LOC!
![Page 12: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/12.jpg)
Spreadshirt
Language Features: Null Safety
“Billion dollar mistake” in Java: Kotlin proposes an alternative
var name: String = "Jon"println(name.length)name = null // does not compile
12
var nullableName: String? = "Jon"println(nullableName.length) // does not compileprintln(nullableName?.length) // 3 or nullprintln(nullableName?.length ?: 0) // 3 or 0if (nullableName != null) { println(nullableName.length) // compiler infers safety}nullableName = null // compiles
![Page 13: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/13.jpg)
Spreadshirt
Language Features: Type Inference
13
Local type inference (compromise)
fun doubleLength(str: String): Int { val stringLength = str.length // == val stringLength: Int = str.length return stringLength * 2}
Single Expression Functionsfun doubleLength(str: String) = str.length * 2// return type inferred
Inference on immediate assignment
class Foo{ val bar = "baz" // == val bar: String = "baz"}
![Page 14: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/14.jpg)
Spreadshirt
Language Features: Devs just wanna have fun
14
Top-Level Functions// Hello World.ktfun main(args: Array<String>) { println("Hello World")}
Extension functions
// definitionfun String.wrap(wrapWith: String) = wrapWith + this + wrapWith// usageval wrapped = "hello".wrap("*")// as opposed to:val wrapped = StringUtils.wrap("hello", "*")
// HelloWorld.javapublic class HelloWorld { public static void main(String[] args) { System.out.println( "Hello World"); }}
![Page 15: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/15.jpg)
Spreadshirt
Language Features: Devs just wanna have fun
15
Proper function typesfun foo(provideString: () -> String, consumeString: (String) -> Int): Int { return consumeString(provideString())}
Concise Lambdasfun safe(code: () -> Unit) { try { code() } catch(e: Exception) { log.ERROR("Exception t_t", e) }}// usagesafe { println("Hello World")}
![Page 16: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/16.jpg)
Spreadshirt
Language Features: Smart Pattern Matching
16
When - A better Switch Case
// myInt: Intval x = when (myInt) { 0 -> "zero" 1, 2 -> "one or two" in 3..10 -> "small number" in 11..Int.MAX_VALUE -> "large number" else -> "negative number"}
enum class Mode { ON, OFF, IDLE }
fun messageForMode(mode: Mode) = when (mode) { Mode.ON -> "Turning on" Mode.OFF -> "Turning off"}// error: 'when' expression is not exhaustive
![Page 17: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/17.jpg)
Spreadshirt
Kotlin at Spreadshirt:Evaluation
![Page 18: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/18.jpg)
Spreadshirt
Welcome to the Enterprise: No Changes without Careful Consideration
18
Pros Cons
Reuse Java ecosystem (big deal!) Niche
Reuse beloved Java frameworks & libs Know-how required
Easy to learn: Conservative language concepts
Risk: Unexpected complications?
Less error prone: NPEs and mutable state easier to avoid
Future of language highly depends on JetBrains
Conciseness: Improved maintainability, less developer frustration
.. but we already have Scala
Management Matrix ™
![Page 19: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/19.jpg)
Spreadshirt
Giving it a Try
19
Start small:
• Migrate a system test suite from Java to Kotlin
• Carve out “misplaced” functionality from a Java monolith to a Kotlin based microservice
• Re-evaluate based on this experience
▪ Advantages significant enough to use Kotlin for the next project?
![Page 20: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/20.jpg)
Spreadshirt
Kotlin at Spreadshirt:Usage
![Page 21: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/21.jpg)
Spreadshirt
Kotlin Usage at Spreadshirt
5 new services purelywritten in Kotlin
1 Java service enriched with Kotlin
21
![Page 22: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/22.jpg)
Spreadshirt
Kotlin Usage at Spreadshirt
Kotlin in conjunction with popular Java frameworks and tools
Jackson
22
![Page 23: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/23.jpg)
Spreadshirt
Taking Advantageof Kotlin in Practice
![Page 24: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/24.jpg)
Spreadshirt
Putting Classes Together
Java Kotlin
24
![Page 25: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/25.jpg)
Spreadshirt
Concise Mapping between Model Classes
data class SnippetEntity(val code: String,val author: AuthorEntity,val date: Instant
)data class AuthorEntity(
val firstName: String, val lastName: String
)
data class SnippetDTO(val code: String,val author: String,val date: Instant
)
25
Icon made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
![Page 26: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/26.jpg)
Spreadshirt
Concise Mapping between Model Classes
fun mapToDTO(entity: SnippetEntity) = SnippetDTO( code = entity.code, date = entity.date, author = "${entity.author.firstName} ${entity.author.lastName}")
26
Icon made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
![Page 27: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/27.jpg)
Spreadshirt
Value Objects
//without value object:fun send(target: String){}
27
//expressive, readable, safefun send(target: EmailAddress){}
//with value object:data class EmailAddress(val value: String)
![Page 28: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/28.jpg)
Spreadshirt
//Java:Table myTable = new Table("MyTable", container);myTable.setSizeFull();myTable.setColumnHeader("code", "Code");myTable.setColumnHeader("date", "Date");myTable.addGeneratedColumn("code", ShortValueColumnGenerator);myTable.setConverter("date", StringToInstantConverter);
Vaadin: Structuring UI Definition with apply()
28
![Page 29: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/29.jpg)
Spreadshirt
Vaadin: Structuring UI Definition with apply()
//Kotlin:val myTable = Table("MyTable", container).apply { setSizeFull() setColumnHeader("code", "Code") setColumnHeader("date", "Date") addGeneratedColumn("code", ShortenedValueColumnGenerator) setConverter("date", StringToInstantConverter)}
29
![Page 30: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/30.jpg)
Spreadshirt
val layout = FormLayout().apply { setMargin(true) isSpacing = true val codeLabel = Label().apply { caption = "Code" value = "Select * From dual;" } val stateLabel = Label().apply { caption = "State" value = "${icon} Successfully executed" } val closeButton = Button("Close").apply { addClickListener { close() } } addComponents(codeLabel, stateLabel, closeButton)}
30
Vaadin: Structuring UI Definition with apply()
![Page 31: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/31.jpg)
Spreadshirt
Vaadin: Extension Functions to Add UI Logic
fun SnippetState.toIcon() = when (this){ SnippetState.EXECUTED -> FontAwesome.THUMBS_O_UP SnippetState.NOT_EXECUTED -> FontAwesome.THUMBS_O_DOWN}
//usage:val icon = state.toIcon()
31
enum class SnippetState {EXECUTED, NOT_EXECUTED}
![Page 32: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/32.jpg)
Spreadshirt
Popular Java Idioms and Patterns are Built-in
32
Java Idiom or Pattern Idiomatic Solution in Kotlin
Getter, Setter, Backing Field Properties
Static Utility Class Top-Level (extension) functions
Immutability, Value Objects data class with Immutable Properties, copy()
Fluent Setter (Wither) Named and Default Arguments, apply()
Method Chaining Default Arguments
Singleton object
Delegation Delegated Properties by
Lazy Initialization Delegated Properties by: lazy()
Observer Delegated Properties by: observable()
![Page 33: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/33.jpg)
Spreadshirt
Drawbacks and Pitfalls
![Page 34: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/34.jpg)
Spreadshirt
Trouble with Object Mapping and XML
34
• JAXB (XML) requires parameterless constructor ↯ Kotlin• Jackson (JSON) supports parameterless constructors.
▪ But poor and buggy XML support
data class SnippetDTO(val code: String, val author: String)
val snippet = Snippet()
• Can’t find data class working for all use cases:▪ Jackson▪ XML and JSON▪ Serialization and Deserialization▪ Nasty XML structure
• Solution: Different data classes for Serialization and Deserialization
![Page 35: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/35.jpg)
Spreadshirt
Final by Default
35
• Some frameworks rely on extension of classes ▪ Spring▪ Mockito
• Solutions:▪ Open classes and methods explicitly▪ Open-all-plugin for Kotlin compiler
class CustomerService { fun findCustomer(id: Int){ //... }}
open class CustomerService { open fun findCustomer(id: Int){ //... }}
Can’t be extended by subclasses!
Works!
![Page 36: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/36.jpg)
Spreadshirt
Pitfalls with Auto-Discovery via Reflection
36
• Java: file path = package
package net.sprd.ServiceA;
• Kotlin: no such requirement• Copy and Paste class EventController to serviceB
package net.sprd.ServiceA
EventController not found!
![Page 37: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/37.jpg)
Spreadshirt
Conclusion
![Page 38: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/38.jpg)
Spreadshirt
Conclusion
38
• Programming for the JVM never felt so satisfying
• We saved ~75% of the code
• Several best practices were more prevalent in Kotlin
• Spring ecosystem worked well
• XML data binding was a major pain point and cost us days
→ Use of Kotlin will continue at Spreadshirt
![Page 39: Spreadshirt Philipp Hauer, Fabian Sudau · → Immutability feels defaultish, encourages better design → Still 100% Java compatible due to interface-based approach. Spreadshirt](https://reader033.vdocument.in/reader033/viewer/2022050209/5f5b7c2a3cf50d60ac513136/html5/thumbnails/39.jpg)
Spreadshirt
Questions?