Kotlin vs. Java am Beispiel Microservices

Gepostet am: 01. April 2019

Seit ihrer Einführung 2016 hat sich die Programmiersprache Kotlin den Ruf erarbeitet, eine Art Java 2.0 zu sein. Viele aus Java bekannte Probleme möchte Kotlin angehen und lösen. Der Hype geht insgesamt in die Richtung, dass Kotlin wesentlich besser sei als Java. Gegensätzlich dazu gibt es Erfahrungsberichte, die aussagen, dass Java deutlich performanter sei als Kotlin. Zu diesem Thema schreibe ich eine Abschlussarbeit in einem Bachelorstudium der Wirtschaftsinformatik. Die Arbeit trägt den Titel: „Kotlin vs. Java anhand von Microservices“ und dieser Blogeintrag ist ein Ergebnisbericht dieser Arbeit. Eine Motivation meiner Arbeit ist es, mehr Klarheit in das oben genannte Thema zu bringen und eine begründete Meinung dazu zu geben.

Java

Java ist eine objektorientierte, statisch typisierte Programmiersprache. Sie wurde 1995 veröffentlicht und ist eine der bekanntesten und meistgenutzten Programmiersprachen. Java funktioniert plattformunabhängig, da die Java Virtual Machine (JVM), die für verschiedene Betriebssysteme angeboten wird. Sie lädt den Bytecode von Java und konvertiert ihn für das jeweilige Betriebssystem. Neben Java können verschiedene andere Programmiersprachen auf die JVM kompilieren, so unter anderem das neuere Kotlin.

Relevante Features von Java, besonders im Vergleich zu Kotlin relevant:

  • Java soll einfach und leicht erlernbar sein.
  • Java ist objektorientiert. (Es gibt keine Möglichkeit, in Java Code außerhalb einer Klasse zu schreiben.)
  • Java ist verteilt.
  • Java ist interpretiert.
  • Java ist robust.
  • Java ist sicher.
  • Java ist plattformunabhängig.
  • Java ist performant.
  • Java ist multithreaded.
  • Java ist eine dynamische Sprache.

Probleme von Java, welcher sich Kotlin annehmen möchte:

  • Einfache Datentypen.
  • NullPointer.
  • Checked Exceptions.
  • Keine funktionale Programmierung.

Kotlin

Die Programmiersprache Kotlin wurde 2016 vom Unternehmen JetBrains veröffentlicht. Sehr viel Aufsehen bekommt Kotlin, seit Google am 17. Mai 2017 bekannt gegeben hat, dass Kotlin nun offiziell für die Android-Entwicklung unterstützt wird.

Kotlin läuft wie Java auf der JVM und profitiert daher von deren Plattformunabhängigkeit. Weiterhin ist Kotlin zu 100% mit Java kompatibel: Das heißt, es ist möglich, in einem Projekt die Programmiersprache von Java zu Kotlin zu wechseln – und umgekehrt. Einige Features von Kotlin, besonders im Unterschied zu Java:

  • Extension functions
  • Null-safety
  • Smart casts
  • String templates
  • Singleton
  • Data classes
  • Operator overloading
  • Type inference

Diese Features sind natürlich nicht Kotlin-exklusiv, sondern in anderen Programmiersprachen bereits vertreten.

Microservices

Die Microservices stellen eine vergleichsweise neue Architekturform in der Softwareentwicklung dar. Im Gegensatz zu klassischer monolithischer Architektur werden mehrere kleinere Dienste entwickelt, die zusammen ein größeres Software-System ergeben. Bekannte Beispiele dafür sind die Plattformen Amazon oder Netflix, wo sich jeder Service auf nur eine Aufgabe beschränkt.

Neben Vorteilen wie Skalierbarkeit und Ausfallsicherheit bringen Microservices auch einige Herausforderungen mit sich. So ist das Testen von vielen kleinen Services schwieriger als das Testen eines großen monolithischen Systems. Auch die Sicherheit für viele Services zu gewährleisten sowie die Kommunikation und den Austausch von Daten gut zu bewerkstelligen, sind Herausforderungen welche die Microservice-Architektur mit sich bringt.

Kotlin vs. Java: Allgemeiner Vergleich

Der Vergleich der beiden Programmiersprachen Java und Kotlin erfolgt in zwei Abschnitten: Zum einen gibt es den Syntaxvergleich, der rein oberflächlich die Syntax der beiden Sprachen nach Kriterien wie Lesbarkeit, Lines of Code und Erlernbarkeit vergleicht. Zum anderen gibt es eine Bewertung der Features von Kotlin unter dem Aspekt, wie diese Features Kotlin von Java unterscheiden. Anschließend an den Vergleich und die Bewertung werden die Features daraufhin untersucht, ob sie im Zusammenhang mit der Microservice-Architektur Vorteile bringen.

Schon ein kurzer Blick genügt um festzustellen, dass Kotlin in den meisten Fällen eine kürzere Syntax hat als Java. So kann z.B. der Rückgabewert einer Funktion weggelassen werden und Variablen müssen nicht manuell typisiert werden.

Auch hat Kotlin einige funktionale Aspekte wie Lambdas und High Order Functions. Dazu kommen Features wie Data Classes, welche die Syntax weiter verkürzen. Die Lesbarkeit ist subjektiv zu bewerten, jedoch legen die vielen Kurzschreibweisen in Kotlin nahe, dass die Syntax vor allem für Anfänger schwerer zu lesen ist. Das Zwischenfazit des Syntaxvergleiches ist also: Für Anfänger ist Kotlin schwieriger zu lesen aufgrund der Kurzschreibweisen. Für erfahrene Entwickler ist die Einschätzung subjektiv.

Die Null Safety ist eines der wesentlichen Verkaufsargumente von Kotlin, das sie das Problem der Null Pointer Exception in Java löst. Variablen, die Null werden können, müssen in Kotlin entsprechend gekennzeichnet werden.

Dieses System wirft aber wiederum neue Probleme auf: Einerseits gibt es einfach viele Collections und Java Frameworks, die Null zurückliefern können, weshalb oft Fehlerfälle berücksichtigt werden müssen. Andererseits ist das Handling von Null-Variablen relativ komplex.

Zusammengefasst kann man sagen, dass Kotlin den Entwickler lediglich zwingt, sich um potenzielle Fehler durch Nullpointer zu kümmern. Ob das Kotlin besser macht als Java ist subjektiv. Jedoch ist es merkwürdig, dass Kotlin hier den Entwickler zur umständlichen Fehlerprävention zwingt, im Fall von Checked Exceptions aber das Gegenteil tut und den Entwickler eben nicht mehr zwingt, sich um mögliche Fehler zu kümmern, um so den try/catch-Block zu ersparen.

Die Features String Templates, Type Inference und Smart Casts führen dazu, dass Kotlin weniger umständlich ist. String Templates sind praktisch, da der Entwickler mit Ihnen Variablen und Befehle in einen String einbinden kann, ohne gefühlte zweihundertmal „+“ zu schreiben.

Auch bei Smart Casts spart Kotlin überflüssigen Code durch das automatische Casten nach einer logischen Prüfung. Sobald ein Objekt auf seine Spezialisierung geprüft wurde, kann es als spezialisiertes Objekt behandelt werden. Hier spart sich der Entwickler die expliziten Casts.

Die Type Inference ermöglicht es, einer Variable in Kotlin keinen Typ zu geben. Kotlin erkennt automatisch den Typ und weist diesen zu:

Dies spart zwar Code, kann aber auf Kosten der Lesbarkeit gehen. Da es jedoch möglich ist, einen Typ explizit anzugeben, kann in unklaren Fällen der Typ angegeben und damit auch verständlicher Code geschrieben werden. Beispiel: var y : String = Hallo Welt . Alle drei Features sparen dem Entwickler das Schreiben von mehr (unnötigem) Code.

Das Feature Singleton (Keyword object) ermöglicht in Kotlin das Verwenden des Singleton-Entwurfmusters.

Das bedeutet also, dass es von einer Klasse nur eine Instanz geben kann, ähnlich dem static aus Java. Dies hat meiner Erfahrung nach nicht sehr gut funktioniert, weshalb ich sagen kann, dass es zumindest einige Einarbeitung erfordert, bis dieses Feature sinnvoll nutzbar ist. Auch wird das static (aus Gewohnheit) immer wieder vermisst.

Die Features Extension Functions und Operation Overloading gibt es beide in Java nicht:

Dies ist darin begründet, dass Java die Sprache sehr einfach halten wollte. Das Operation Overloading speziell ist in Kotlin dazu noch etwas limitiert, da nur dann Operatoren überladen werden können, wenn sie in der Klasse vorher noch keine Funktion hatten. Das „+“ der Klasse Integer kann z.B. nicht überladen werden.

Ob solche Features einer Sprache gut sind oder nicht, ist wieder rein subjektiv. Sie eröffnen einerseits mehr Möglichkeiten, machen die Programmiersprache Kotlin andererseits aber auch anspruchsvoller zu erlernen.

Zuletzt geht es in diesen Vergleichsbeispielen um die Data Classes von Kotlin. Die default Getter- und Setter-Methoden sind in allen Klassen in Kotlin gegeben und kein Teil der Datenklassen. Sonstige Methoden wie copy(), toString(), hashCode() und equals() werden durch das data Keyword automatisch erzeugt. Allerdings sind Datenklassen final. Es ist nicht möglich, sie abstrakt zu machen oder von ihnen zu erben. Sie sind wirklich nur für Daten gedacht.

Das Ergebnis des Feature-Vergleichs sieht wie folgt aus:

  • Alle Vergleichspunkte wurden in meiner Thesis zur einfacheren Wertung in 4 Kategorien eingestuft:
  • Gut: Das Feature ist besser als es in Java gelöst wurde.
  • Subjektiv: Es gibt sowohl Argumente für als auch gegen dieses Feature.
  • Schlecht: Dieses Feature ist eher ein Problem an Kotlin.
  • Irrelevant: Das Feature/Argument hat in dem Vergleich nichts zu suchen.

In dieser Liste sind drei Features als “Gut” aufgeführt, acht als “Subjektiv”, vier als “Schlecht und drei als “Irrelevant”. Daraus ergibt sich, dass Kotlins Eignung als Programmiersprache im Vergleich zu Java vor allem subjektiv ist.

Kotlin vs. Java: Vergleich mit Microservices

Der Vergleich zwischen Java und Kotlin im direkten Bezug auf Microservices ergab kaum Ergebnisse. Die meisten der Microservice-Herausforderungen können nicht verallgemeinert von Java oder Kotlin besser gelöst werden. Da Kotlin auch alle Java Frameworks verwenden kann, können fast alle Technologien, die in Java genutzt werden, auch in Kotlin genutzt werden. Es gibt vereinzelte Unterschiede, doch für diese Unterschiede gibt es auch direkt verschiedene Lösungen. Ein detailliertes Eingehen auf diese Unterschiede würde den Rahmen der Arbeit sprengen. Auch wenn weder Java noch Kotlin direkte Vorteile für eine Microservice-Herausforderung haben, so können doch die einzelnen Features einen gewissen Unterschied machen. Da viele Services z.B. Datenbankanbindungen haben, können die Datenklassen von Kotlin hier echte Vorteile bringen.

Jedoch kann man bei keiner der beiden Programmiersprachen sagen, dass sie besser für Microservices geeignet ist als die andere. Das liegt zum Großteil auch daran, dass sie sehr viel gemeinsam haben und miteinander kombiniert werden können.

Fazit und Zusammenfassung

Java und Kotlin laufen beide auf der Java Virtual Machine und zeigen daher keine Unterschiede im Bezug auf die Performanz. Die Unterschiede belaufen sich also primär auf die Syntax und das Repertoire an Möglichkeiten, welches die jeweilige Sprache bietet.

Java hat den Anspruch, einfach und robust zu sein. Java ist komplett Objektorientiert, es gibt also keine Möglichkeit, dass eine Methode außerhalb einer Klasse stehen kann. Die Möglichkeiten, welche Java als direkte Befehle durch Key-Words mitbringt, sind recht gering. Dadurch sind sie leicht zu verstehen und zu merken. Neuere Java-Versionen haben zunehmend komplexere Features (wie seit Java 8 die Lambda-Expression), jedoch bleibt die Grundlage immer dieselbe: Es werden Variablen als primitive Datentypen oder Objekt-Referenzen angelegt. Auf diesen Referenzen werden dann Methoden ausgeführt, teilweise mehrere hintereinander. Dies ist sehr gut lesbar und übersichtlich, denn das Grundprinzip verändert sich nicht und die Implementierung jeder Methode lässt sich problemlos prüfen. Jedoch sind auch bei “Clean Code” die Methodenaufrufe oft sehr lang und es kann dauern, bis der Code wirklich verstanden wird. Die Features und Möglichkeiten in Java kommen somit über zusätzliche Objekte zustande, die durch Bibliotheken eingebunden werden.

Kotlin ist aus Java heraus entstanden und hat den Anspruch, die Möglichkeiten dieser Programmiersprache zu erweitern und zu verbessern. Teilweise gelingt dies sehr gut. In Kotlin wird kein Semikolon gebraucht um einen Befehl zu beenden. Das zeigt sehr gut, was Kotlin erreichen will: Anwenderfreundlichkeit. Viele Features von Kotlin bauen auf diesem Prinzip auf und setzen es gut um. Ein Beispiel hierfür sind die Default Arguments. Die meisten Kotlin Features haben den Zweck, umständliche Funktionen von Java zu vereinfachen. Das funktioniert gut: Kotlin ist kompakter als Java. In einigen Fällen steigt als Nebeneffekt die Komplexität, was wiederum eine verminderte Lesbarkeit des Codes mit sich bringen kann. Dies zu bewerten ist allerdings sehr subjektiv. Ein starkes Argument für Kotlin ist das Vorhandensein neuer Features, die zusätzliches Potenzial bieten, jedoch rein fakultativ sind. Entwickler können frei entscheiden, ob sie ein bestimmtes Feature verwenden wollen.

tl;dr

Zusammengefasst kann man sagen, dass Kotlin mehr Möglichkeiten bietet als Java. Für einen erfahrenen Programmierer kann sich diese Vielfalt an Möglichkeiten als hilfreich erweisen, aus Sicht eines unerfahrenen Programmierers kann dies aber auch Nachteile haben: Mehr Möglichkeiten bedeuten auch mehr Verantwortung, die Möglichkeiten sinnvoll einzusetzen und Features nicht unnötig zu verwenden. So kann ein erfahrener Programmierer mit Kotlin kurzen und gut lesbaren Code schreiben, während der Code eines weniger erfahrenen Programmierers durch den Einsatz inadäquater Features eher unleserlich wird. Wer also bereits fortgeschrittene Kenntnisse des Programmierens hat, mehr Möglichkeiten zur Verfügung gestellt haben möchte, und bereit ist, sich intensiv in eine neue Programmiersprache einzuarbeiten, der sollte sich Kotlin unbedingt anschauen.

Wer es dagegen lieber so einfach wie möglich hält oder häufig mit unerfahrenen Entwicklern zusammen arbeitet, sollte eher bei Java bleiben.

Referenzen

Weiterlesen

Du möchtest auch eine Abschlussarbeit in der Softwareentwicklung schreiben oder suchst eine Stelle als WerkstundentIn? Dann schau dir unsere Jobseite an. Wenn du mehr über unsere Leistungen erfahren möchtest, schau auf unserer Website vorbei.

2019-03-29T11:59:00+00:00

Hinterlassen Sie einen Kommentar