Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

record Point( int x, int y) { } data class Point( val x: Int, val y: Int)

Slide 3

Slide 3 text

data class Point( val x: Int, val y: Int) record Point( int x, int y) { }

Slide 4

Slide 4 text

record Point( int x, int y) { } data class Point( val x: Int, val y: Int)

Slide 5

Slide 5 text

record Point( int x, int y) { } data class Point( val x: Int, val y: Int)

Slide 6

Slide 6 text

record Point( int x, int y) { } @JvmRecord data class Point( val x: Int, val y: Int)

Slide 7

Slide 7 text

record Point( int x, int y) { } @JvmRecord data class Point( val x: Int, val y: Int)

Slide 8

Slide 8 text

record Point( int x, int y) { } @JvmRecord data class Point( val x: Int, val y: Int)

Slide 9

Slide 9 text

record Point( int x, int y) { } var point = new Point(10, 20); // (10, 20) @JvmRecord data class Point( val x: Int, val y: Int) val point = Point(10, 20) // (10, 20)

Slide 10

Slide 10 text

record Point( int x, int y) { } var point = new Point(10, 20); // (10, 20) @JvmRecord data class Point( val x: Int, val y: Int) val point = Point(10, 20) // (10, 20) val newPoint = point.copy(20) // (20, 20)

Slide 11

Slide 11 text

record Point( int x, int y) { } var point = new Point(10, 20); // (10, 20) @JvmRecord data class Point( val x: Int, val y: Int) val point = Point(10, 20) // (10, 20) val newPoint = point.copy(20) // (20, 20) With Expressions (JEP 468)

Slide 12

Slide 12 text

record Point( int x, int y) { } var point = new Point(10, 20); // (10, 20) var newPoint = point with { x = 20 } // (20, 20) @JvmRecord data class Point( val x: Int, val y: Int) val point = Point(10, 20) // (10, 20) val newPoint = point.copy(20) // (20, 20) With Expressions (JEP 468)

Slide 13

Slide 13 text

Is Java always playing catch-up With Kotlin?

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

The Bytecode

Slide 16

Slide 16 text

@JvmRecord data class Point( val x: Int, val y: Int)

Slide 17

Slide 17 text

public String toString(); public int hashCode(); public boolean equals(Object); @JvmRecord data class Point( val x: Int, val y: Int)

Slide 18

Slide 18 text

public String toString(); public int hashCode(); public boolean equals(Object); @JvmRecord data class Point( val x: Int, val y: Int)

Slide 19

Slide 19 text

public String toString(); public int hashCode(); public boolean equals(Object); @JvmRecord data class Point( val x: Int, val y: Int)

Slide 20

Slide 20 text

public String toString(); public int hashCode(); public boolean equals(Object); @JvmRecord data class Point( val x: Int, val y: Int)

Slide 21

Slide 21 text

public String toString(); Code: 0: new #34 / / class StringBuilder 3: dup 4: invokespecial #35 / / Method StringBuilder 7: ldc #37 / / String Point(x= 9: invokevirtual #41 / / Method StringBuilder 12: aload_0 13: getfield #13 // Field x:I 16: invokevirtual #44 // Method StringBuilde 19: ldc #46 // String , y= 21: invokevirtual #41 // Method StringBuilde 24: aload_0 25: getfield #16 // Field y:I 28: invokevirtual #44 // Method StringBuilde 31: bipush 41 33: invokevirtual #49 // Method StringBuilde 36: invokevirtual #51 // Method StringBuilde 39: areturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 22

Slide 22 text

public String toString(); Code: 0: new #34 / / class StringBuilder 3: dup 4: invokespecial #35 / / Method StringBuilder 7: ldc #37 / / String Point(x= 9: invokevirtual #41 / / Method StringBuilder 12: aload_0 13: getfield #13 // Field x:I 16: invokevirtual #44 // Method StringBuilde 19: ldc #46 // String , y= 21: invokevirtual #41 // Method StringBuilde 24: aload_0 25: getfield #16 // Field y:I 28: invokevirtual #44 // Method StringBuilde 31: bipush 41 33: invokevirtual #49 // Method StringBuilde 36: invokevirtual #51 // Method StringBuilde 39: areturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 23

Slide 23 text

public int hashCode(); Code: 0: aload_0 1: getfield #13 / / Field x:I 4: invokestatic #57 / / Method java/lang/Int 7: istore_1 8: iload_1 9: bipush 31 11: imul 12: aload_0 13: getfield #16 // Field y:I 16: invokestatic #57 // Method java/lang/In 19: iadd 20: istore_1 21: iload_1 22: ireturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 24

Slide 24 text

public int hashCode(); Code: 0: aload_0 1: getfield #13 / / Field x:I 4: invokestatic #57 / / Method java/lang/Int 7: istore_1 8: iload_1 9: bipush 31 11: imul 12: aload_0 13: getfield #16 // Field y:I 16: invokestatic #57 // Method java/lang/In 19: iadd 20: istore_1 21: iload_1 22: ireturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 25

Slide 25 text

public boolean equals(Object); Code: 0: aload_0 1: aload_1 2: if_acmpne 7 5: iconst_1 6: ireturn 7: aload_1 8: instanceof #2 // class org/acme/Point 11: ifne 16 14: iconst_0 15: ireturn 16: aload_1 17: checkcast #2 // class org/acme/Point 20: astore_2 21: aload_0 22: getfield #13 // Field x:I 25: aload_2 26: getfield #13 // Field x:I 29: if_icmpeq 34 32: iconst_0 33: ireturn 34: aload_0 35: getfield #16 // Field y:I 38: aload_2 39: getfield #16 // Field y:I 42: if_icmpeq 47 45: iconst_0 46: ireturn 47: iconst_1 48: ireturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 26

Slide 26 text

public boolean equals(Object); Code: 0: aload_0 1: aload_1 2: if_acmpne 7 5: iconst_1 6: ireturn 7: aload_1 8: instanceof #2 // class org/acme/Point 11: ifne 16 14: iconst_0 15: ireturn 16: aload_1 17: checkcast #2 // class org/acme/Point 20: astore_2 21: aload_0 22: getfield #13 // Field x:I 25: aload_2 26: getfield #13 // Field x:I 29: if_icmpeq 34 32: iconst_0 33: ireturn 34: aload_0 35: getfield #16 // Field y:I 38: aload_2 39: getfield #16 // Field y:I 42: if_icmpeq 47 45: iconst_0 46: ireturn 47: iconst_1 48: ireturn @JvmRecord data class Point( val x: Int, val y: Int)

Slide 27

Slide 27 text

record Point( int x, int y) { }

Slide 28

Slide 28 text

record Point( int x, int y) { } public String toString(); public int hashCode(); public boolean equals(Object);

Slide 29

Slide 29 text

record Point( int x, int y) { } public String toString(); public int hashCode(); public boolean equals(Object);

Slide 30

Slide 30 text

record Point( int x, int y) { } public String toString(); public int hashCode(); public boolean equals(Object);

Slide 31

Slide 31 text

record Point( int x, int y) { } public String toString(); public int hashCode(); public boolean equals(Object);

Slide 32

Slide 32 text

public final String toString(); Code: 0: aload_0 1: invokedynamic #19, 0 6: areturn record Point( int x, int y) { }

Slide 33

Slide 33 text

public final String toString(); Code: 0: aload_0 1: invokedynamic #19, 0 6: areturn record Point( int x, int y) { }

Slide 34

Slide 34 text

record Point( int x, int y) { } public final int hashCode(); Code: 0: aload_0 1: invokedynamic #23, 0 6: ireturn

Slide 35

Slide 35 text

record Point( int x, int y) { } public final int hashCode(); Code: 0: aload_0 1: invokedynamic #23, 0 6: ireturn

Slide 36

Slide 36 text

record Point( int x, int y) { } public final boolean equals(Obje Code: 0: aload_0 1: aload_1 2: invokedynamic #27, 0 7: ireturn

Slide 37

Slide 37 text

record Point( int x, int y) { } public final boolean equals(Obje Code: 0: aload_0 1: aload_1 2: invokedynamic #27, 0 7: ireturn

Slide 38

Slide 38 text

So what’s the difference?

Slide 39

Slide 39 text

Java Records can take advantage of the JVM’s implementation and future improvements for the toString, equals & hashCode methods without recompiling.

Slide 40

Slide 40 text

In a lot of cases Kotlin is playing catch-up with Java