Now in kotlin it feels like it's just "drown it in question marks". I certainly end up with lots of nonnull signatures and far more reliable null handling than in java, but the ease almost feels wrong.
it starts that way, but over time you don't need the question marks as much because you're dealing with more and more code where the variables are guaranteed to not be null.
Some coworkers seem to type questionmarks faster than that IntelliJ "convert to kotlin" button and I hate it, but much less than I'd expect.
Question marks are basically more concise Optional chaining.
if (o instanceof SomeClass) {
o.someClassMethod();
}
Following this line of reasoning I could want to assign it to a local var: if (o instanceof SomeClass) {
final var s = o;
...
}
An analogous situation arises with null: if (o != null) {
final var s = o;
...
}
Making the type of `s` a non-null type of `o`s type.The annoying thing with Java language development is that they just don't seem interested in rounding it out with consistency/completeness.
I fairly strongly prefer Optional over nullable types. Especially how it works seamlessly with streams.
There are still issues at the API boundaries with Java or JS code, but that's about it. Outside of that, NPEs are usually in more niche places to do with initialization order and that sort of stuff.
Of course if you're inventing a totally new language you probably want to just avoid the possibility of null outright.
Now, I will say that build times are way better on Java. A large part of this is the ability to generate ABI jars with Gradle, which you can't do with Kotlin. If anyone from Gradle or Jetbrains are reading this, please please please try and make this work, I know there's ongoing tickets but in larger projects Kotlin and Java are not even close, for this specific reason.