Java sealed classes and exhaustive pattern matching

(neilmadden.blog)

74 points | by hnisjafx40 3 hours ago

3 comments

  • armchairhacker 2 hours ago
    Java also has recursive patterns and (maybe still in preview) literal patterns: `switch (x) { case A(B(true, var c)) -> f(c); }`
  • timshel2 1 hour ago
    Scala punching the air rn
    • AdrenalinMd 18 minutes ago
      I still write Scala. But not sure for how long. I swear, it's such a joy to write code in Scala.

      It's like French poetry.. So much elegance. An no effect system BS. Just like Martin Odersky intended it to be!

      • tentacleuno 7 minutes ago
        Curious what you meant about the effect system BS?
    • dozerly 51 minutes ago
      Sigh, I so very miss writing Scala.
  • Larrikin 2 hours ago
    Java continues to try and catch up to Kotlin https://kotlinlang.org/docs/sealed-classes.html

    I didn't mind Java when the comparisons were to C++, Ruby, and Python. I can not find a reason to go back after Scala (which seemed to fail due to being indiscriminate) and especially Kotlin

    • pron 1 hour ago
      A hoarder may have much more furniture than I do, but if I buy a sofa it doesn't mean I'm trying to catch up to the hoarder (who has five). Java isn't trying to catch up for the simple reason that we don't want it to have all the features Kotlin does; in fact, we're trying very hard to avoid that (not to mention that we have yet to adopt a single Kotlin feature; our features usually take a different form, even though Kotlin, Java, and many other languages often rely on the same inspiration, which is usually the ML language). That's because some languages aim to be feature-rich while others aim to be more minimal. Both are likely to accumulate features over time, but at very different rates (we'll hold off on features for years until we're satisfied that their value justifies the added complexity to the language, as keeping that relatively low is very important to us).

      If you like a richer language, the Java platform offers you options, but many people prefer smaller languages (the number of Java Platform developers who use the Java language has remained pretty much at a constant ~90% for the past 15 or more years), but we're aware that a non-tiny minority of developers prefer richer languages, and so we accommodate them, too. Either way, 95% of the JDK is runtime (standard library and the JVM) and tooling, and you'll enjoy it regardless of which frontend language you prefer.

      • bmacho 59 minutes ago
        > Both are likely to accumulate features over time, but at very different rates (we'll hold off on features for years until we're satisfied that their value justifies the added complexity to the language, as keeping that relatively low is very important to us).

        This strategy will still navigate Java into a random local optimum like it happened with other languages (that value backward compatibility), just more slowly. The greedy algorithm does that. Even if you do it slowly and you are extra careful that each step indeed betters the language.

        • oldsecondhand 8 minutes ago
          The issue is that it's hard to predict how certain features will be misused and even harder to remove a harmful feature from a language. That's why Java goes slow. (Although I think there's too much pussyfooting around string interpolation. But I also think too much type inference makes the code harder to read.)
        • valzam 42 minutes ago
          Of course, invoking 'there are two kinds of languages: one that people complain about and one that nobody uses', there are two kinds of language designs: one that is perfectly consistent and one that has had contact with the real world.
      • dtech 24 minutes ago
        > not to mention that we have yet to adopt a single Kotlin feature; our features usually take a different form, even though Kotlin, Java, and many other languages often rely on the same inspiration, which is usually the ML language

        This seems disingenuous at best, or it's a symptom that I've noticed as a user more often that your JDK team seems to have blinders on and dismisses/ignores most other languages even if feature have proven themselves 10 times over.

        There's several features Java added or is trying to add, usually 5-10+ years later than Kotlin, and that's ignoring Scala:

        * Local type inference

        * Switch expressions

        * Records, although I found them barely usable because there is no copy() method or with-ers

        * String templates unsuccessfully

        * A very stripped down version of smart-casting with switch pattern matching

        I'm sure there's tech-debt and esoteric compatibility concerns which make evolving Java hard, but from a developer's perspective it's just glacial to evolve and the result is weaksauce.

    • DarkNova6 1 hour ago
      What I like about Java is that it is a deliberate late-mover language. It doesn't go for the latest shiny thing but looks at what features have proven themselves in other languages.

      I can't help but to be a little sobered by the promises of Kotlin and C#. They look great on the surface, but once you have more complicated code to work on they tend to show warts quite fast.

      Java is remarkably consistent and really doesn't have any sharp edges. Even with generics and type erasure, I found myself fighting the language semantics in C# way more often than Java.

      • jayd16 45 minutes ago
        > I found myself fighting the language semantics in C# way more often than Java

        What's an example? I find C# quite well designed despite the Chinese menu of features.

        > Java is remarkably consistent and really doesn't have any sharp edges. Even with generics and type erasure [...]

        These back to back with a straight face...What is a sharp edge in your mind?

        • arein3 30 minutes ago
          A sharp edge is writing meta typesystem code infolving covariance, invariance etc

          Saw that in a typescript repository

          It's ok when it's part of a very specific library, it's not ok using it as part of usual project code

          • jayd16 13 minutes ago
            What is the significant difference to Java? In C# you would write something like Foo<out Bar> instead of Foo<? extends Bar> or some such thing.
      • cogman10 1 hour ago
        I personally enjoy Kotlin. There are potential warts with it, but those exist with other languages.

        That said, Java taking it's time and observing the playing field is a huge benefit. And now that they've been slowly delivering new language features, it's really made it pretty nice flow of powerful well thought out extensions each release. There hasn't been one of the new features that I think missed the mark.

    • sthuck 38 minutes ago
      I would definitely trim like 20% off scala, but I think slow compile times were the main reason. To a much lesser degree but sbt being one of the first things you deal with when learning the language didn't help.

      If you put a gun to my head and tell me you can't write in kotlin, you must choose either Java or Scala - for a small project I think I choose modern Java. If you tell me I need to choose for a large cross team and mission critical project - I think I take the bullet.

      Still, I have a soft spot in my heart for scala, learned a lot from it.

    • biglyburrito 1 hour ago
      Java still inexplicably doesn't have first-class support for string interpolation/templates. They were slated to add it in Java 23, but they removed it from the preview and it hasn't been seen since.

      https://www.happycoders.eu/java/string-templates/

      • pjmlp 1 hour ago
        Because the feedback on how they worked apparently wasn't that positive.

        Also who cares having to use String.format() in the agentic coding age?

        • mystifyingpoi 1 minute ago
          Interesting point - syntax sugar was nice when writing code by hand. Now we'd be fine if no such sugar was added anymore ever again.
        • kbenson 1 hour ago
          Honestly, I still write a lot of perl, and while interpolation is nice and good to have for simple things, I find myself using sprintf more and more in production code, especially in the cases the examples always show off, such as needing to alter the variable, add two together, etc. I assume those are just shown to illustrate you you can do that, and not imply you should, because commonly using arbitrary code execution within interpolation is something I'd feel compelled to beat out of my coworkers if I encountered it regularly.
    • Sharlin 41 minutes ago
      To be fair, sealed classes were introduced in Java 15 back in 2020. But granted pattern matching is what makes them really useful.
    • jmarlow47 1 hour ago
      Kotlin feels like it's having an identity crisis. The gap between the two languages continues to decrease. Kotlin is trying to be server-side, Android, but also every other platform (KMP). Feels like everything is brand new and also deprecated at the same time, always moving on to something new.

      Maybe Roman really was the soul and it lost its touch without him?

      I guess in the age of AI it doesn't matter since a few years from now, if you change your mind, you can just ask Jeeves to one-shot rewrite it back to Java.

      • jeroenhd 38 minutes ago
        Until Java fixes its type system to add nullable types (and not in that ridiculous tri-state nullability method that one JEP proposes), Kotlin will be several steps ahead of Java.

        I can speak from experience that Fable 5.1 still writes code that compiles and usually runs fine but throws null pointer exceptions in reasonable edge cases.

        • arein3 27 minutes ago
          Waiting so long for type safety and hoping it won't be a weird implementation.

          Kotlin's implementation is very good, hoping with all my heart java will copy it

    • sideeffffect 2 hours ago
      > Java continues to try and catch up to Kotlin

      Does it, really? Java has had pattern matching since 21 (2023). Kotlin still, to this day, the year of our Lord 2026, doesn't...

      • tancop 27 minutes ago
        Kotlin had it since 1.0, it's just called `when` instead of `match`.

        https://kotlinlang.org/docs/control-flow.html#expressions

      • dtech 15 minutes ago
        Kotlin has always had smart-casting in if and when (sort of switch) expressions, which are strictly more powerful than the current version of Java "pattern matching". Both don't do de-structuring which I would consider a basic requirement for pattern matching, but at least Kotlin didn't call it pattern matching.
    • 14u2c 14 minutes ago
      This comment has major 2018 vibes. Most enterprises I know have have migrated back to mainline Java. We'll see if this changes again LLM era, now that prioritizing the talent pool is less important and the friction of migrating stacks is much reduced.
    • pjmlp 1 hour ago
      It is the Java Virtual Machine for a reason.

      Without Google's godfather, Kotlin would be gone for now.

      Kotlin is so great, where is the Kotlin Virtual Machine, showing how Kotlin can stand on its own?

      • jayd16 42 minutes ago
        Uhm, Kotlin does compile to native without the JVM doesn't it? It runs in the JVM for Java interop, no?

        https://kotlinlang.org/docs/native-overview.html

        • pjmlp 26 minutes ago
          Nope, the JVM is the main platform, and also used for Android development, which by the way, still mostly uses Android Java on the platform code.

          Kotlin Native came later, its memory model was incompatible with Java, thus breaking portability for libraries between JVM and Kotlin Native, thus Jet Brains had to reboot Kotlin Native memory model.

          https://blog.jetbrains.com/kotlin/2021/05/kotlin-native-memo...

          Currently it is mostly used to port Android code into iOS apps, hardly something that even JetBrains could show off running their IDEs on top off, nah, they still need the JVM.

        • dathanb82 36 minutes ago
          Pretty sure it’s the other way around: Kotlin was implemented on the JVM and that’s its primary target, and got a native implementation later for folks that don’t want to run a JVM.
          • jayd16 30 minutes ago
            Is that relevant? Kotlin fully exists without the JVM, as requested.
            • dathanb82 20 minutes ago
              Sort of? The kotlin standard library yes, but it’s pretty rare to write an app with only the standard library. It feels like you’re dismissing the Java interop as a secondary benefit, but for most uses of Kotlin it’s probably more important to project success than the language itself. So I think it’s accurate that without the JVM Kotlin would be essentially dead.
              • jayd16 18 minutes ago
                > dismissing the Java interop as a secondary benefit

                I mean, I don't really care about any of that. I was just responding to the (likely unserious) technical critique that there is no Kotlin VM. As for whether Kotlin as a language would be popular without the JVM, that's a different question.

            • pjmlp 25 minutes ago
              A subset of Kotlin has a native backend, not good enough to power JetBrains products, which still require Java Virtual Machine.

              It is so good, that JetBrains themselves rather use Rust or C++ for native code libraries on their IDEs, and not officially supported on the Android NDK.

              • jayd16 20 minutes ago
                So the goal post is JetBrains has to rewrite their stack in Kotlin native for Kotlin to not need the JVM?
                • oldsecondhand 1 minute ago
                  Eating your own dogfood has always been a milestone of maturity.
    • pixelstack 1 hour ago
      Scala*
    • troupo 1 hour ago
      Of all languages the only one it's trying to catch up to (and in places outran) is C#

      With many others it doesn't compete because it would need a from-scratch rewrite of the runtime (Erlang/Elixir), or a from-scratch redesign of the type system (Rust, perhaps Swift).