Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modul- und Sichtbarkeitskonzepte in Kotlin und ...

Modul- und Sichtbarkeitskonzepte in Kotlin und Java

Vortrag Jan Baganz und Kristine Schaal: "Modul- und Sichtbarkeitskonzepte in Kotlin und Java", IT-Tage, 11. Dezember 2019
https://www.ittage.informatik-aktuell.de/programm/2019/kotlin-und-java-modul-und-sichtbarkeitskonzepte/

Auf den ersten Blick ähnlich, unterscheiden sich die Sichtbarkeitskonzepte von Kotlin und Java doch in wichtigen Punkten. So ist der Default in Kotlin "public", in Java dagegen "package-private". Das gibt es in Kotlin nicht, denn Packages dienen in Kotlin nur der Organisation der Klassen und sind deshalb nicht relevant für die Sichtbarkeit. Den Modifikator "protected" gibt es in beiden Sprachen, jedoch mit unterschiedlicher Semantik. Neu in Kotlin ist der Sichtbarkeitsmodifikator "internal". Damit kann man die Sichtbarkeit auf ein Kotlin-Modul einschränken. Aber Vorsicht! Ein Modul in Kotlin ist etwas anderes als ein Modul in Java. Verwirrt?
In unserem Vortrag werden wir die Sichtbarkeitsmodifikatoren auseinanderdröseln, erklären und vergleichen. Seit JDK 9 gibt es mit der Einführung von Jigsaw ein Modulkonzept als Sprachfeature. Wir erklären die Integration von Jigsaw-Modulen in Kotlin und Java.
Noch nicht verwirrt genug? Aus Kotlin heraus kann man Java-Code verwenden und andersherum. Wir erläutern, wie sich dabei die Sichtbarkeitskonzepte vertragen und auswirken.

Avatar for Kristine Schaal

Kristine Schaal

December 11, 2019

More Decks by Kristine Schaal

Other Decks in Technology

Transcript

  1. Copyright © Accso – AcceleratedSolutions GmbH 1 09. – 12.12.2019

    Frankfurt am Main #ittage Modul- und Sichtbarkeitskonzepte in Kotlin und Java Jan Baganz, Kristine Schaal
  2. Copyright © Accso – AcceleratedSolutions GmbH 2 v.3 v.3.19 Modul-

    und Sichtbarkeitskonzepte in Kotlin und Java Jan Baganz, Dr. Kristine Schaal – IT-Tage 2019 – 11. Dezember 2019 Darf ich das bitte mal sehen?
  3. Copyright © Accso – AcceleratedSolutions GmbH 3 Abstract Auf den

    ersten Blick ähnlich, unterscheiden sich die Sichtbarkeitskonzepte von Kotlin und Java doch in wichtigen Punkten. So ist der Default in Kotlin "public", in Java dagegen "package- private". Das gibt es in Kotlin nicht, denn Packages dienen in Kotlin nur der Organisation der Klassen und sind deshalb nicht relevant für die Sichtbarkeit. Den Modifikator "protected" gibt es in beiden Sprachen, jedoch mit unterschiedlicher Semantik. Neu in Kotlin ist der Sichtbarkeitsmodifikator "internal". Damit kann man die Sichtbarkeit auf ein Kotlin-Modul einschränken. Aber Vorsicht! Ein Modul in Kotlin ist etwas anderes als ein Modul in Java. Verwirrt? In unserem Vortrag werden wir die Sichtbarkeitsmodifikatoren auseinanderdröseln, erklären und vergleichen. Seit JDK 9 gibt es mit der Einführung von Jigsaw ein Modulkonzept als Sprachfeature. Wir erklären die Integration von Jigsaw-Modulen in Kotlin und Java. Noch nicht verwirrt genug? Aus Kotlin heraus kann man Java-Code verwenden und andersherum. Wir erläutern, wie sich dabei die Sichtbarkeitskonzepte vertragen und auswirken.
  4. Copyright © Accso – AcceleratedSolutions GmbH 4 Jan Baganz, Accso

    - Accelerated Solutions GmbH Softwareentwickler Jan Baganz ist Softwareentwickler bei der Accso - Accelerated Solutions GmbH. Er entwickelt seit vielen Jahren Anwendungen in Java und Kotlin. Aktuell unterstützt er Kunden in der Entwicklung und dem Betrieb Cloud-nativer Anwendungen. [email protected] @janbaganz www.xing.com/profile/Jan_Baganz Kristine Schaal, Accso - Accelerated Solutions GmbH Softwarearchitektin Dr. Kristine Schaal ist als Softwarearchitektin bei der Accso - Accelerated Solutions GmbH tätig. Sie arbeitet seit 20 Jahren in der Softwareentwicklung und ist in Projekten der Individual- entwicklung für Kunden verschiedener Branchen unterwegs, technisch überwiegend im Java- Umfeld. [email protected] @krschaal www.xing.com/profile/Kristine_Schaal
  5. Copyright © Accso – AcceleratedSolutions GmbH 5 Modulsysteme in Java

    und Kotlin Sichtbarkeitsmodifikatoren in Java und Kotlin Warum Modul- und Sichtbarkeitskonzepte? Agenda Testen mit Modulen Java und Kotlin kombinieren Fazit
  6. Copyright © Accso – AcceleratedSolutions GmbH 6 Mit Modul- und

    Sichtbarkeitskonzepten Designprinzipien umsetzen Öffentliche Schnittstelle Schnittstelle für den Zugriff von außen definieren. Nutzer verwenden nur die Schnittstelle. Interna kapseln mit Sichtbarkeitsmodifikatoren oder Modulen Implementierungsgeheimnis Von außen ist kein Zugriff auf die Implementierung möglich. Änderungen der Implemen- tierung wirken sich nur lokal aus, beeinflussen Nutzer nicht.
  7. Copyright © Accso – AcceleratedSolutions GmbH 7 Modulsysteme in Java

    und Kotlin Sichtbarkeitsmodifikatoren in Java und Kotlin Warum Modul- und Sichtbarkeitskonzepte? Agenda Testen mit Modulen Java und Kotlin kombinieren Fazit
  8. Copyright © Accso – AcceleratedSolutions GmbH 8 Ebenen der Kapselung

    pkg.this Komponenten Foo Bar Baz Ableitung … … … Einzelne Klasse oder Verbund mehrerer Klassen pkg.this Bar Baz Foo … …
  9. Copyright © Accso – AcceleratedSolutions GmbH 9 pkg.this Ebenen der

    Kapselung: Java pkg.this Komponenten Foo Bar Baz Ableitung Bar Baz Foo … … … … … Einzelne Klasse oder Verbund mehrerer Klassen public protected <package> private Default Java-Module
  10. Copyright © Accso – AcceleratedSolutions GmbH 10 Ebenen der Kapselung:

    Kotlin … … … public protected private Default Einzelne Klasse oder Verbund mehrerer Klassen Foo Bar Baz Ableitung Komponenten Bar Baz Foo … … Kotlin-Module
  11. Copyright © Accso – AcceleratedSolutions GmbH 11 Vergleich Sichtbarkeitsmodifier Java,

    Kotlin Default-Sichtbarkeit ist ein- geschränkt (package-sichtbar) Packages beeinflussen Sichtbarkeit Protected: Sichtbarkeit in Vererbungshierarchie und im package Default-Sichtbarkeit ist offen (public) Packages haben keine Auswirkung auf die Sichtbarkeit Protected: Sichtbarkeit nur innerhalb der Vererbungshierarchie Java Kotlin
  12. Copyright © Accso – AcceleratedSolutions GmbH 12 Exkurs: Vererbung Per

    default offen gegenüber Vererbung Explizite Einschränkung durch Keyword final Konvention beim Überschreiben mit Annotation @Overrides Per default keine Vererbung erlaubt Explizites Erlauben von Vererbung über opens Explizites Überschreiben durch override Java Kotlin Wie trägt Vererbung zur Sichtbarkeit / Modularisierung bei?
  13. Copyright © Accso – AcceleratedSolutions GmbH 13 Modulsysteme in Java

    und Kotlin Sichtbarkeitsmodifikatoren in Java und Kotlin Warum Modul- und Sichtbarkeitskonzepte? Agenda Testen mit Modulen Java und Kotlin kombinieren Fazit
  14. Copyright © Accso – AcceleratedSolutions GmbH 14 Java: Ein Module

    als „First-Class-Citizen“ Module := Menge von Java-Packages & Resources Wird in ein „Modular JAR“ kompiliert. Dieses liegt im neuen Module-Path. Module-Namen müssen eindeutig sein. Im Module-Deskriptor stehen: • Name • Abhängigkeiten • Zugriffsschutz Keine weiteren Syntax- oder Sprachkonstrukte! module mod.this { requires mod.that; exports pkg.this; opens pkg.this.1; } mod.this/module-info.java
  15. Copyright © Accso – AcceleratedSolutions GmbH 15 Readability und Accessibility

    von Java-Modulen, Checks mod.this mod.that read exports pkg. this pkg. that. impl pkg. that module mod.this { requires mod.that; } module mod.that { exports pkg.that; }
  16. Copyright © Accso – AcceleratedSolutions GmbH 16 Readability und Accessibility

    von Java-Modulen, Checks Checks zu Compile-Zeit und zur Laufzeit 1) Modul: Readability „ich benötige dieses Modul“ 2) Modul: Accessibility „Auf welche Packages erlaube ich den Zugriff?“ (Default: Keins!) 3) Check der Sichtbarkeitsmodifier public, protected, <package>, private mod.this mod.that read exports pkg. this pkg. that. impl pkg. that
  17. Copyright © Accso – AcceleratedSolutions GmbH 17 internal: Sichtbar innerhalb

    eines Kotlin-Moduls class Foo { internal val a = 42 internal fun bar(){…} } internal Funktionen, Methoden, Variablen internal class Foo {…} internal Klassen internal fun bazz() {…} globale Funktion
  18. Copyright © Accso – AcceleratedSolutions GmbH 18 Kotlin: Modul als

    Compile-Unit Was ein Kotlin-Modul ist (und damit die „Grenze“ für den Modifier internal) wird zur Compile-Zeit über die zu diesem Zeitpunkt angegebene Struktur definiert. A1 src/dira/pkga src/dirb/pkgb A2 B1 B2 B3 kotlinc src -d kmod.jar A1 A2 B1 B2 B3 pkgb Als ein Modul kompiliert. A1 darf B1 aufrufen. internal internal kmod pkga
  19. Copyright © Accso – AcceleratedSolutions GmbH 19 Kotlin: Modul als

    Compile-Unit Was ein Kotlin-Modul ist (und damit die „Grenze“ für den Modifier internal) wird zur Compile-Zeit über die zu diesem Zeitpunkt angegebene Struktur definiert. A1 src/dira/pkga src/dirb/pkgb A2 B1 B2 B3 A1 pkga A2 B1 B2 B3 pkgb Als zwei Module kompiliert. A1 darf B1 nicht aufrufen. internal kotlinc src/dira -d kmoda.jar kotlinc src/dirb -d kmodb.jar internal kmoda kmodb
  20. Copyright © Accso – AcceleratedSolutions GmbH 20 Kotlin: Modul als

    Compile-Unit Was ein Kotlin-Modul ist (und damit die „Grenze“ für den Modifier internal) wird zur Compile-Zeit über die zu diesem Zeitpunkt angegebene Struktur definiert. A1 src/dira/pkga src/dirb/pkgb A2 B1 B2 B3 A1 A2 B1 B2 B3 internal Zugriffs- schutz nur zur Compile-Zeit Zur Laufzeit Aufruf möglich pkga pkgb kmoda internal kmodb Aufruf per Reflection
  21. Copyright © Accso – AcceleratedSolutions GmbH 21 Zusammenfassung: Was macht

    ein Kotlin-Modul aus? Die Dateien, die zusammen compiliert werden, bilden das Modul Die mit internal markierten Methoden/Klassen/Felder sind vor Zugriffen von außerhalb des Moduls geschützt
  22. Copyright © Accso – AcceleratedSolutions GmbH 22 Struktur von Kotlin-Modulen

    in Entwicklungswerkzeuge Ein Kotlin-Modul = ein IntelliJ-Modul = ein Maven/Gradle-Modul
  23. Copyright © Accso – AcceleratedSolutions GmbH 23 Java-Module, Kotlin-Module: Ein

    Vergleich, der hinkt default closed Was nicht explizit exportiert ist, ist nicht zugreifbar Zugriffsschutz ausschließlich auf package-Ebene Moduldeskriptor, keine Änderung an Klassen Modulbildung über explizite Beschreibung Zugriffsschutz zur Compile- und Laufzeit default open Was nicht explizit internal ist, ist zugreifbar Zugriffsschutz auf allen Ebenen Funktionen, Methoden, Klassen. Package ist nicht relevant Modifier im Code Modulbildung implizit über gemeinsam kompilierte Klassen Zugriffsschutz nur zur Compile- zeit Java Kotlin
  24. Copyright © Accso – AcceleratedSolutions GmbH 24 Modulsysteme in Java

    und Kotlin Sichtbarkeitsmodifikatoren in Java und Kotlin Warum Modul- und Sichtbarkeitskonzepte? Agenda Testen mit Modulen Java und Kotlin kombinieren Fazit
  25. Copyright © Accso – AcceleratedSolutions GmbH 25 Java-Module testen: Blackbox-Test

    Blackbox-Tests werden in separates Java-Module ausgelagert. Dieses Testmodule benötigt keinen Zugriff auf interne Klassen. mod.test mod.this exports pkg. test pkg.this pkg.this .impl read
  26. Copyright © Accso – AcceleratedSolutions GmbH 26 Java-Module testen: Whitebox-Test

    Whitebox-Test testet interne Klassen von mod.this aus pkg.this.impl. Bei eigenem Test-Module wären zusätzlich exports nötig! Besser: Testcode getrennt ablegen und für Compile der Tests und für Testdurchführung in das Module „reinpatchen“. my.mod exports my.pkg my.pkg .impl src/test/java mod.this pkg.this pkg.this .impl pkg.this .impl MyTest
  27. Copyright © Accso – AcceleratedSolutions GmbH 27 Kotlin-Module testen Test-Compile:

    Modul enthält den Test-Code. Testklasse darf auch internal-Code aufrufen. Test src/test/kotlin src/main/kotlin B1 B2 B3 kotlinc src -d kmod.jar B1 B2 B3 internal internal kmod Test
  28. Copyright © Accso – AcceleratedSolutions GmbH 28 Kotlin-Module testen Compile

    für Deployment auf operative Umgebungen: Modul enthält keinen Test- Code. Test src/test/kotlin src/main/kotlin B1 B2 B3 kotlinc src/main -d kmod.jar internal B1 B2 B3 internal kmod
  29. Copyright © Accso – AcceleratedSolutions GmbH 29 Modulsysteme in Java

    und Kotlin Sichtbarkeitsmodifikatoren in Java und Kotlin Warum Modul- und Sichtbarkeitskonzepte? Agenda Testen mit Modulen Java und Kotlin kombinieren Fazit
  30. Copyright © Accso – AcceleratedSolutions GmbH 30 (Modul-)Grenzen überschreiten: Kotlin

    Compiler Error class Foo { internal fun bar() } fun bazz() { Foo().bar() } mod.this mod.that
  31. Copyright © Accso – AcceleratedSolutions GmbH 31 (Modul-)Grenzen überschreiten: Kotlin

    – Java – Kotlin Aufruf möglich! mod.this fun bazz() { JavaWrapper().hack() } public class JavaWrapper{ void hack(){ new Foo() .bar$kotlinInternal() } } class Foo { internal fun bar() } mod.that
  32. Copyright © Accso – AcceleratedSolutions GmbH 32 (Modul-)Grenzen überschreiten: Java

    – Kotlin – Java public class Foo … class KotlinWrapper{ … } package hidden class Bar { … } module mod.that { //keine exports } Compiler Error mod.this mod.that
  33. Copyright © Accso – AcceleratedSolutions GmbH 33 Kotlin- und Java-Module

    kombinieren Java-Module für Kotlin benutzbar module jmod.this { requires jmod.that; } module jmod.that { exports …; } Kotlin1 Kotlin2 Java1 kmod.this jmod.this Kotlin3 Kotlin4 Java2 kmod.that jmod.that
  34. Copyright © Accso – AcceleratedSolutions GmbH 34 Zusammenfassung: Wer gewinnt

    bei der Sichtbarkeitsprüfung? Kotlin-Code Java-Byte-Code compiliert zu Kotlin-public, protected, private bleiben erhalten. internal ist in Java nicht bekannt, kompiliert zu public. Kann daher über Java “gebrochen“ werden. Kein Laufzeit-Schutz Java-Module auch für Kotlin nutzbar Kotlin-Module haben keine Bedeutung in Java
  35. Copyright © Accso – AcceleratedSolutions GmbH 35 Fazit Kotlin Module

    und Java-Module haben verschiedene Konzepte und Ziele. Java-Module Strikter Komponentenschnitt - öffentlicher Schnittstelle, gekapselte Implemtierung. Architekturentscheidung Framework-/ Sprach- entwicklung im Fokus Kotlin-Module Kapselung einzelner Interna Implementierungsebene (keine Architektur- entscheidung) leichtgewichtig Kotlin ist (zu?) offen: public als default erfordert Disziplin Beide Modulsysteme stehen nicht in Konkurrenz zueinander, sind sogar kombinierbar
  36. Copyright © Accso – AcceleratedSolutions GmbH 36 36 Copyright ©

    Accso GmbH Accso – Accelerated Solutions GmbH T | +49 6151 13029-0 E | [email protected] @ | www.accso.de Hilpertstraße 12 | 64295 Darmstadt Im Mediapark 6a | 50670 Köln Balanstraße 55 | 81541 München https://speakerdeck.com/kristines @accso @janbaganz @krschaal