Angst vor Kotlin

KonradN

Super-Moderator
Mitarbeiter
Aber es gab ja schon Ansätze, dass man NPE über reine statische Codeanalyse verhindern könnte. Aber irgendwie hat das nie jemanden interessiert.
Daher scheint das kein wirklichen Bedarf dafür zu geben.

Zumindest ich habe in freier Wildbahn sowas noch nicht gesehen.
 

LimDul

Top Contributor
joa... aber braucht man das ?
Ja!
NPEs sind mit die häßlichsten Exceptions, weil die gerne mal "random" auftreten.

Wir haben bei uns einen Wrapper (Decimal) um BigDecimal, wo es auch ein NULL-Objekt gibt. So dass ich folgendes machen kann:

Java:
Decimal.valueOf(20).add(Decimal.NULL)
Das macht Rechnungen so viel einfacher, wenn man nicht dauernd auf != null prüfen muss.

Wir arbeiten auch viel mit SpotBugs CheckForNull / NonNull um einfach früh auf Fehler hingewiesen zu werden.
 
Y

yfons123

Gast
Schon mal in BASIC eine NPE gehabt?
nein ich hatte das vergnügen nur einmal mit visual basic zu arbeiten als ich makros für word dokumente im 6ten semester erstellen durfte... ach wie ich basic vermisse... so eine einfache übersichtliche sprache

und dass alles halb deutsch und englisch gemischt ist... einfach herrlich
dass in excel alles deutsch ist und in word alles englisch macht es auch natürlich viel einfacher
 

KonradN

Super-Moderator
Mitarbeiter
Wir arbeiten auch viel mit SpotBugs CheckForNull / NonNull um einfach früh auf Fehler hingewiesen zu werden.
Ja, sowas macht durchaus Sinn und wie du gesehen hast: Ich habe mich gewundert, denn ich habe das bisher so richtig in Projekten noch nicht gesehen und das hat mich halt gewundert.

Hast Du Dir den Kotlin schon im Detail angesehen und würde das hier wirklich so viel verändern?
Vielleicht habe ich da auch bisher nur schlechten Code gesehen, denn da war das dann meist nur etwas, das man als if (x != null) x.doSomething();. Aber ich sehe es nicht als wirklichen Vorteil, keine NPE zu bekommen, denn in der Regel ist das ja nur ein weitermachen, wo vorher bereits ein Fehler passiert ist.

Aber da ich mich da noch nicht so tief mit beschäftigt habe, kannst Du da ggf. noch etwas mehr dazu sagen.
 

LimDul

Top Contributor
Ich hab von Kotlin null Ahnung, daher kann ich dazu nix sagen. Aber eine NPE vermeiden kann man glaub ich nicht nur mit Sprachfeatures, sondern nur mit gescheiter Softwarearchitektur + Sprachfeatures die das fördern.
 

mihe7

Top Contributor
Das stimmt so nicht. Es gibt viele Basic Varianten und Visual Basic .Net kennt auch ein null. Heißt dort aber Nothing.

Darum habe ich ja auch von BASIC geschrieben, nicht von irgendwelchen Dialekten oder VB.

Der Punkt ist doch: wo nichts auf null zeigen kann, kann es auch keine NPE geben. Klar, man kann alles mögliche dagegen tun, aber genau genommen, ist das doch schwachsinnig. Hätten wir in den Sprachen kein null, bräuchte man sich darum nicht zu kümmern.

Kotlin macht das in vielen Fällen, wobei ich mich frage, warum man nicht ganz auf null verzichtet hat. Stattdessen spendiert man der Sprache noch einen not-null-assertion-Operator, der dazu dient, im Fall von null eine NPE zu werfen.
 

Jw456

Top Contributor
Der !! Operator dient auch dazu um zb. beim Aufruf einer Java Methode die null zurückgeben kann. Das Ergebnis aber in eine nicht nullbaren Variablen gespeichert werden soll.
Das würde der Kompiler sonst gar nicht zu lassen. In Kotlin hast du nun die Möglichkeit auf die NPE zu reagieren.
 

KonradN

Super-Moderator
Mitarbeiter
Jetbrains nutzt es relativ viel, und IntelliJ hat recht gute Unterstützung dafür.
Ok, Quellcode, der von Jetbrains kommt, habe ich bisher noch nicht gross gesehen. Die Unterstützung in IntelliJ kenne ich. Das habe ich mir damals alles mal angesehen als wir vor paar Jahren mal eine Diskussion rund um Clean Code hatten. Ist aber schon lange her ... Nur das findet man sonst fast nie. Ich mag da nur ein sehr eingeschränkten Bereich sehen, aber wenn ich dann in jedem Maven Projekt direkt das PMD Plugin drin habe macht mich gefühlt schon fast zum Ausgegrenzten.
 

KonradN

Super-Moderator
Mitarbeiter
In der Sprache Kotlin sehe ich auch nicht so sehr die großen Vorteile. Ich habe es mir damals auch einmal angesehen und war kurz davor zu wechseln. Aber was auf den ersten Blick toll und gut aussah hatte dann doch nicht den Vorteil, den man sich erhofft hat. Ich bin damals auch über ein Blog Eintrag gestolpert, der das ein kleines bisschen beschreibt. Ist so nicht ganz meine Sicht, aber ich gebe den Link einfach einmal rein: https://blog.allegro.tech/2018/05/From-Java-to-Kotlin-and-Back-Again.html

Man kann vieles Diskutieren. Und ja, manches ist besser. Legacy Code war ein Problem, aber da gibt es dann Lösungen wie z.B. Project Lombok. Und wenn einem die Probleme mit null so problematisch scheinen: https://spotbugs.github.io/ ist ja schon erwähnt worden und man kann @CheckForNull und @Nonnull nutzen und hat dann auch eine sehr gute zusätzliche Sicherheit.
 

temi

Top Contributor
Und wenn einem die Probleme mit null so problematisch scheinen: https://spotbugs.github.io/ ist ja schon erwähnt worden und man kann @CheckForNull und @Nonnull nutzen und hat dann auch eine sehr gute zusätzliche Sicherheit.
Es ist schon ein entscheidender Unterschied, ob eine Sprache es zwar ermöglicht bestimmte Dinge besser (und sicherer) zu lösen, aber es "im Standard" nicht tut oder ob eine Sprache bestimmte Sachen von Haus gar nicht zulässt, oder man es explizit erlauben muss.

Rust geht da z. B. ja noch einen Schritt weiter.
 

KonradN

Super-Moderator
Mitarbeiter
Es ist schon ein entscheidender Unterschied, ob eine Sprache es zwar ermöglicht bestimmte Dinge besser (und sicherer) zu lösen, aber es "im Standard" nicht tut oder ob eine Sprache bestimmte Sachen von Haus gar nicht zulässt, oder man es explizit erlauben muss.

Rust geht da z. B. ja noch einen Schritt weiter.
Da Kotlin aber immer noch vieles zulässt bringt es unter dem Strich eben nicht wirklich eine Besserung. Dafür, dass es sonst we groß angepriesen wird war es unter dem Strich in meinen Augen enttäuschend und führte dazu, dass dann galt keine NPE kommt aber halt einfach etwas nicht gemacht wurde... Das ist dann diese ? Syntax oder erinnere ich mich falsch? Ist schon zu lange her.

Bitte mich nicht missverstehen: Das ist durchaus eine Entwicklung, die ich begrüße und ich will es nicht zerreden. Meine Punkte sind schlicht:
  • das kann man mit Java auch haben wenn man es will.
  • die Wichtigkeit sehe ich in der Praxis nicht, denn ich sehe dies bei kaum einem Entwickler. Ich finde es extrem befremdlich, wenn hier Java Entwickler auftreten und sagen "Das ist ein wichtiger Punkt, das muss man haben", aber dann werden die Möglichkeiten nicht genutzt.

Und das ganze Thema Clean Code ist wichtig, aber wie viele Projekte haben das nicht? Auch hier im Forum haben wir Diskussionen mit Entwicklern mit vielen Jahren Erfahrung, die dann Unit Tests ablehnen. Das ist kein Argument, dass es sowas nicht braucht. Aber die Gewichtung ist da dann wichtig.

Und wir reden hier darüber, die Sprache zu wechseln. Warum zu Kotlin wechseln? Evtl. sind dann andere Sprachen besser. Rust hast du erwähnt. Go hat teilweise interessante Ansätze. Dart schien mir auch einige Dinge zu haben, die ich interessant fand (Habe mir da die Spezifikation aber auch nur kurz angesehen). Generell gibt es sehr kluge Köpfe die ständig dran sind, Sprachen zu verbessern oder gar neue Sprachen von Grund auf zu erstellen. Und da wäre ich dann deutlich offener auch was die Paradigmen angeht.

Die JVM als Basis war evtl. mal eine Zeit lang wichtig, aber das ist ja durch die Plattformunabhängigkeit der anderen Sprachen obsolet. Selbst Java verläßt diese ja mehr oder weniger mit GraalVM würde ich (etwas ketzerisch) sagen.
 
Y

yfons123

Gast
c# hat das gleiche mit dem fragezeichen und ganz ehrlich: es ist für den arsch

ich kann ja sowieso den vergleichs operator überschreiben und dann zb sowas tun

C#:
if(obj)
{
    obj.DoStuff();
}
dann ist das halt wieder unnötig dass man den fragezeichen operator hat wenn man auch die operator überladung hat... dann hat man wieder 10 möglichkeiten

in unity wird der ? operator von denen die ihren code in discord posten nie benutzt... das sind paar 100 leute täglich und keine sau nimmts her genauso wie die operator überladung...die meisten machen eine Add methode

die einzige "operator" überladung die man nutzt ist die die unity geschrieben hat mit zb
vector / quaternion
da halt rider was die "beste" IDE ist auch nicht drauf klar zusätzlich.. entweder man weis es oder man ist am arsch.. bei methoden wirds einem angezeigt

aber da der CEO von unity scheiße gebaut hat ist das interesse vieler sowieso weg von unity und bei godot genauso wie bei mir.. die haben auch c# und kotlin .. trollolol
 

dzim

Top Contributor
Ich klinke mich jetzt hier aus. Ich habe lange genug Java programmiert und mache es noch immer und bilde mir meine Meinung nicht nur anhand von "ich habe es mir damals mal angeschaut und fande es nicht so toll wie angepriesen" (dann muss man halt zu Rust wechseln!).

Ich finde es ok, wenn nicht jeder das so empfindet und manche Java als mehr Expressiv (oder was auch immer) wahrnimmt.

Gerade die Null-Safety und die Scoped Functions (und alles drum herum) - und auch speziell die Extension Functions - machen für mich diese Sprache um einiges eleganter. Natürlich ist das im JVM-Umfeld nicht Bombensicher, da die JVM das selbst nicht wirklich untersützt. Es ist nur Compile-Zeit-Analyse (und jede Menge entsprechender Checks im ByteCode am Ende).

Kotlin eignet sich vor allem gut für DSLs - etwas, was mit Java natürlich auch geht, aber um Welten weniger elegant. Beispiel JavaFX mit TornadoFX. Ich geh nicht mehr zurück zu FXMLs und Controllern oder hanebüchenen Libraries, damit man irgendwie MVVM oder so was hinbekommt...

Auch Coroutinen sind für mich im Moment sehr wichtig im alltäglichen Geschäft. Klar kann man das mit Java auch... gewissermassen... solange Project Loom noch nicht durch ist aber auch nur über Hlfsmittel wie Akka.

So long.
 
Y

yfons123

Gast
JavaScript und Typescript haben es auch, ist super und wird meiner Erfahrung nach sehr häufig genutzt.
der ? funktioniert in unity nicht da es sein kann dass die engine das objekt nicht mehr hat aber c# hat das objekt noch dh du hast bei dem ? ein true obwohl es false sein müsste

das betrifft nur objekte im spiel... aber niemand nimmts her für "normale objekte"
 

KonradN

Super-Moderator
Mitarbeiter
Und es war nicht das ? sondern tatsächlich die notwendigen ! in Verbindung mit (Java) Libraries. Das hatte verhindert, dass Kotlin den Vorteil richtig ausspielen konnte.

Wobei sich da evtl. einiges verändert haben könnte durch womöglich weniger ‚Java‘ Abhängigkeiten.
 
Y

yfons123

Gast
du hast halt "multi setter" deklarationen die es auch in c# gibt die halt das builder pattern "unwichtiger" machen

zb
Java:
blabla... VBox{
    height=100,
    width=200,
    managed=false,
}
was dir alle setter aufruft.. ist halt angenehm .. ka was die syntax in kotlin ist aber da gibts das auch
 

temi

Top Contributor
Die Diskussion ging jetzt schon ziemlich ins Detail. Ich wollte eigentlich eher in die Richtung "Wo steht Kotlin gerade?" "Soll ein Neueinsteiger lieber Kotlin lernen?" diskutieren, siehe "Ich traue mich mal vorauszusagen dass in 5 Jahren eine andere Sau durchs Dorf getrieben wird". Ein Nischendasein hat Kotlin offenbar weiterhin. Anscheinend gibt es aber dennoch Menschen, die Kotlin nutzen.

Meiner Ansicht nach ist es die bessere Variante, wenn eine Sprache versucht inhärent sicher(er) zu sein, als vom Programmiere zu verlangen, eine potentiell unsichere Sprache, durch geeignete Techniken sicherer zu machen. Das ist auch ein wichtiges Prinzip in der Unfallverhütung (fällt mir gerade nebenbei so ein). Jeder Fehler, der gar nicht gemacht werden kann, tritt auch nicht auf. Ob das Kotlin ist, sei mal dahingestellt. Es versucht auf jeden Fall in die richtige Richtung zu gehen.

Jenseits der möglichen Sicherheitsaspekte: Was ist von den anderen Ansätzen Kotlins zu halten, wie "Kotlin for JavaScript" oder "Kotlin Native"? Hat da jemand Erfahrungen mit gesammelt?

@dzim Kannst du mir sagen, ob das in Kotlin "schöner" geht?
Java:
Java:
setOnMouseDragged(this::mouseDragged);
So habe ich es in Kotlin:
Java:
onMouseDragged = EventHandler<MouseEvent> {
            mouseDragged(it)
        }
Ich hab nach Methodenreferenzen gesucht, aber nichts gefunden...
 

KonradN

Super-Moderator
Mitarbeiter
Da stimmen wir ja überein @temi. Die Uneinigkeit ist lediglich bei der Bewertung der Konsequenzen.

Variablen können Methoden beinhalten. Es geht in Kotlin etwas wie
Java:
val someFuncVar1 = ::otherFunc

val someFuncVar2 = { .... }

Ersteres ist die Methodenreferenz und das Zweite die Lambda Expression.

Aufruf ist einfach die Variable mit ().

Ansonsten tiefer ins Detail z.B. bei

Und da ggf auch interessant

Aber gibt bestimmt noch bessere Quellen aber bin hier am Smartphone und da ist es eine Wual so eine Quelle zu verifizieren.
 

KonradN

Super-Moderator
Mitarbeiter
Und dann doch noch einmal schnell an den Computer - denn die Language Specification ist auf dem Smartphone nicht wirklich angenehm anzusehen.

Wichtige Punkte in der Kotlin Language Specification:
- Function Types: https://kotlinlang.org/spec/type-system.html#function-types
mit Beispielen wie:
// A valid assignment w.r.t. function type variance
// Function1<in Int, out Any> :> Function1<in Number, out Number>
val fooRef: (Int) -> Any = ::foo
// A valid assignment w.r.t. function type variance
// Receiver is just yet another function argument
// Function1<in Int, out Any> :> Function1<in Number, out Number>
val barRef: (Int) -> Any = Number::bar

In dem Zusammen nebensächlich aber auch betroffen:
Function literals: https://kotlinlang.org/spec/expressions.html#function-literals

Was ich jetzt auf Anhieb nicht finden konnte war die tatsächliche Erläuterung der Methodenreferenz. Aber ist halt doch etwas her, dass ich mir das angesehen hatte.
 

Neue Themen


Oben