Java 27 Released

(mail.openjdk.org)

133 points | by mkurz 1 hour ago

8 comments

  • moomin 1 hour ago
    C# dev here: it’s amazing how different this is from a Microsoft release. First off, Oracle are doing versions at approximately twice the cadence. But also, and I’m guessing this is a function of the much larger Java audience: things rarely get two preview versions in a proper release. Updates in beta versions, yes, all the time. It also feels like Microsoft are bundling a lot more into the platform and leaving less to the community. Again, probably an artifact of the different sizes of the communities. Also, the page reads like an open source “We’re finished, we’re tired.” announcement rather than the razzmatazz of a Microsoft release.
    • kllrnohj 1 hour ago
      > First off, Oracle are doing versions at approximately twice the cadence

      Is that actually a good thing?

      But Oracle started playing a game, for better or worse, where they decided to couple the "language version" with a single specific runtime's release schedule. For example, in "Java 27" there are exactly 0 language changes and 1 minor feature addition to the TLS library.

      Everything else is OpenJDK runtime internals which don't impact the language or how you use it. So if you don't use OpenJDK (such as if you use Oracle's other runtime, GraalVM), then Java 27 basically doesn't even exist at all. Skimming the past couple of C# releases, it doesn't look like Microsoft is playing that game, so the release cadence will of course be different.

      • pron 10 minutes ago
        The Java language and runtime have been co-designed as a unified platform for many years now. Virtually every significant feature has language, library, and VM people working on it, and we often don't even know when we start how much of the feature would be in the language, library, or VM. Consequently, there is no "language version" or a "runtime version". There's only a platform version, which is defined in a single spec approved by the JCP (https://openjdk.org/projects/jdk/27/spec/). This also makes things easier with regards to compatibility and evolution.
      • hyperpape 58 minutes ago
        You’re only counting JEPs, which are only for more involved features. There are lots of changes to the JDK apis that are used by other runtimes. See, for instance: https://javaalmanac.io/jdk/27/apidiff/26/.

        Admittedly, the terminology here is almost designed to be maximally confusing, and I’ve never read a good post that laid out how everything relates.

        • kllrnohj 39 minutes ago
          Fair, although even there I don't know if I'd call that "lots" at just 23 added or modified methods that aren't in preview
      • cogman10 45 minutes ago
        There's not really a second C# runtime. Java has several, some based on the Openjdk, but a few that are completely new like OpenJ9 and Graal.

        The closest C# has is mono.

        This sort of thing is bound to happen with that situation. Heck, it happens with C++ whenever a new C++ version comes out. Some C++11 features took years to make their way into all the compilers.

        • vlovich123 34 minutes ago
          Graal is based on OpenJDK. OpenJ9 while using a separate JVM and JIT leverage the openjdk class path as well as the build environment and various other things.

          I don’t think there’s a single alternate implementation that doesn’t leverage a good chunk of openjdk somehow

      • saghm 8 minutes ago
        I didn't read the parent comment as being particularly positive in their description; it didn't sound like it was being stated as a good thing to me.
    • petilon 50 minutes ago
      > Microsoft are bundling a lot more into the platform and leaving less to the community.

      This is a good thing. In Java everything has multiple community offerings, so before doing anything you have to evaluate the community offerings and decide which one to go with. If you go with the wrong one you may end up having to switch at some point, and that can be painful. This happens so often that most of the time spent when using Java is doing these evaluations and comparisons. With C# you just use the one built into .NET platform. Saves a ton of time.

      • PaulHoule 20 minutes ago
        Sometimes the thing built into the .NET platform is great, sometime it is just crap but developers will use it anyway and it sets back the ecosystem.

        There is this division of labor between systems programmers and application programmers and often we think systems programmers are better because they know more about algorithms and data structures and compilers and assembly language and such. On the other hand, application developers understand how to reconcile the mental model of managers and employees and customers with computers, reality and common sense and, once they get experienced, see the commonalities between all the run-of-the-mill bizapps that we are coding all the time.

        Application programmers do a lot better at applications framework than systems programmers and make things like Ruby on Rails and Spring. Systems programmers make terrible things like ASP.NET MVC (I worked out a way to do MVC with ordinary ASP.NET, why couldn't they, with access to the platform internals?)

      • throwaway91033 33 minutes ago
        If someone wants to create a project by assembling bits and pieces from different open source products they can, but many just go for Spring (Boot) and call it a day.

        All of my projects are based on Spring and I don't really have to look outside of that ecosystem. It almost acts as an aggregator of different open source solutions and often works by abstracting the functionality so that differences are not that big. I recently switched messaging providers and didn't have to change much of my code.

        • rwyinuse 28 minutes ago
          Yep, with Spring Boot development is so easy, and even decade old projects are mostly easy to upgrade. I don't have experience from C# or .NET development, but at least compared to Python and especially JS ecosystems it's so much better.
          • hirvi74 13 minutes ago
            > Python and especially JS ecosystems it's so much better.

            That's a pretty low bar to beat.

    • theandrewbailey 1 hour ago
      I never thought of Java being the 'move fast ~and break things~' alternative over .NET, but Java has a faster release schedule to get features out sooner.
      • madduci 55 minutes ago
        Seriously, how many are using always the latest releases of Java instead the LTS ones? With LTS ones you have ~2/3 years between the versions.
        • throwaway91033 19 minutes ago
          We often use the latest version of Java at my work place. We haven't had any issues with upgrading, so there's no benefit of waiting for an LTS. There's no big process behind it either. The developers just quietly change the version as part of keeping the project up to date (BAU)

          It may be that we are shielded from edge cases because we are based on Spring, which is probably the most tested piece of software before new versions of Java are released. But it's my impression that the risk of upgrading to a new version of Java is not the same today as it was in the past. The only advantage of an LTS is that it is supported longer, so that you can postpone the upgrade if you really want. It's not as if the intermediate releases are inferior or less safe.

    • hirvi74 14 minutes ago
      I kind of wish C# would slowdown releases in some areas. I have not been a huge fan of some of the changes in the past year. I love the performance changes and bits of functionality here and there, but the syntax-sugar is getting annoying.
      • ygra 7 minutes ago
        You don't really have to use the latest C# version, though. Install the latest .NET and you get the performance improvements without usually having to change anything about your code.
      • kittoes 9 minutes ago
        Interesting take, how is optional functionality annoying? Isn't the fact that it's just sugar a huge benefit? Us old timers can simply stick to what we're familiar with.
        • fourseventy 2 minutes ago
          Because unless you are the only person maintaining your codebase other people in your organization will start using the cool new syntax sugar and optional functionality. So you will be forced to deal with it as it starts showing up in your codebase.
        • pjc50 7 minutes ago
          I don't get this either. You can even lock the language level if you really don't want it, or you can just ignore it.
    • Betelbuddy 49 minutes ago
      >> Oracle are doing versions at approximately twice the cadence.

      This has nothing to do with Oracle. All good that you hear from Java in the last few years, is the great community and good old people from Sun working at Oracle.

      • grodriguez100 36 minutes ago
        “The good old people from Sun working at Oracle” is now Oracle as well.
    • Phelinofist 49 minutes ago
      > Also, the page reads like an open source “We’re finished, we’re tired.”

      I mean it's short and concise and there are additional resources that provide more detail. IMHO it's not a bad thing.

    • BatchJob 58 minutes ago
      razzmatazz? Do you mean marketing lies and self aggrandizement for merely doing shoddy work?
      • jayd16 49 minutes ago
        Mads Torgersen's previews and such are enjoyable and upbeat, for example.
  • aaronax 1 hour ago
    "The Java Story" documentary by CultRepo on YouTube is pretty great. A major topic is the release cadence which some other comments here are mentioning / joking about.
  • Horffupolde 1 hour ago
    Serious question: when should one use Java for greenfield projects in 2026?
    • marginalia_nu 52 minutes ago
      Not at all a bad choice.

      It's stable to the point of boring, and there's no shortage of people who know the language and can work with it, it's got best in class tooling, decades worth of libraries almost all very mature. Most of the language's issues are from legacy code bases coded in a style that isn't really relevant to a greenfield project.

      • gentlewater 27 minutes ago
        It’s still missing null safety, right? Which means it’s still a hard no for me.
        • winrid 6 minutes ago
          I have a couple 50k+ loc java projects written entirely by LLMs at this point that have never thrown an NPE.
        • marginalia_nu 26 minutes ago
          Have you tried not returning null or constructing incomplete objects?
          • gentlewater 12 minutes ago
            Can I trust code I’ve written myself with no guarantees from the language? Maybe. Can I trust code written by dozens of other developers (and/or agents) working on the same project over multiple years? Definitely not.
            • marginalia_nu 9 minutes ago
              Why don't you have any coding standards? If you're working with agents in particular, catching and enforcing this stuff should be easier than ever.
          • saghm 5 minutes ago
            Do you never use external libraries?
        • LelouBil 24 minutes ago
          You can either use Kotlin then, or simply use java and nullability annotations, they have good support in both IDEs and analysis tools
          • gentlewater 11 minutes ago
            I use Kotlin as my main language and I’m very satisfied with it.
        • well_ackshually 8 minutes ago
          Any serious project will be using NullAway and annotating everything (or, indeed, using Kotlin).

          Otherwise, yeah, you're still in for a world of pain.

    • t0mas88 1 hour ago
      When building boring web applications with a sizeable team that need to run for a long time. Hiring developers is easy since there are many, there is nearly no magic and the language is quite strict and type safe so it works well with a large team.

      And that "team" nowadays may also consist of many AI agents. In my experience Claude Code for example works very well with a typed, slightly boring language with lots of framework and library support. Because it doesn't compile when you get something wrong, instead of getting a vague runtime issue that Claude can't always see.

      • BoppreH 45 minutes ago
        > there is nearly no magic

        I agree with the rest, but there's definitely a lot of magic in Java. This is from both what features the languages makes available (many) and how the community uses them (often). I've had so many hard-to-debug issues in Java over the years due to reflection, annotations, and bytecode manipulation shenanigans.

        And another positive point for Java: checked exceptions. It's verbose, but knowing exactly in which ways a function can fail is extremely helpful for building robust applications.

        • kccqzy 9 minutes ago
          A lot of that is coding style. I’ve also seen a lot of hard-to-debug issues in Python caused by reflection, weird decorators that muck around with name-mangled symbols, and bytecode manipulation. It took me quite a long time to accept that the recommended unit testing library manipulates bytecode so that the exception message for `assert a == b` prints the values for both.
        • msluyter 34 minutes ago
          I haven't really been in the java space for a while now, but I recall there being a fair bit of criticism[1][2] of checked exceptions over the years.

          [1] https://www.javacodegeeks.com/2026/01/javas-checked-exceptio...

          [2] https://reflectoring.io/do-not-use-checked-exceptions/

          WRT magic, I've generally thought that was a result of frameworks - Spring, for example. In the past, my feeling was that these impose a sort of meta/configuration language that itself is not checkable at compile time, so you'd get weird runtime errors that are somewhat inexplicable. This was like... 2018 though, so perhaps things have improved.

          • BoppreH 19 minutes ago
            I'd argue that checked exceptions are still worth it, even though all the problems pointed out do exist. And that's because it works to inform consumers of what a producer is doing. Haskell has the IO and Maybe monads; Java communicates the same information through IOException and other domain exceptions.

            Many times I've decided to switch from one function to another, or even an entirely new library, because the checked exceptions told me that it was doing far more than I expected, and I was not comfortable introducing those new failure modes.

            It's far from perfect, one still has to handle nulls and wrapped/merged exceptions, but overall I like this language feature.

          • voidfunc 29 minutes ago
            Checked exceptions are controversial mostly because a lot of the core APIs use them in places where it's pointless to check, like IOException.

            Using them correctly can be great tho.

            • ndriscoll 2 minutes ago
              Scala's ZIO also demonstrates that they're a great idea and perfectly ergonomic, but you need type inference, which Java devs were resistant to for a long time (maybe still are?). If you infer the exception type, they're basically invisible except for when you forget to have some place in your program to handle them, which is exactly what you want.
            • PaulHoule 11 minutes ago
              Mostly I think they are a mistake, like in ordinary application code instead of catching close to the throw you want to do a lot of

                try {
                   ...
                } finally() {
                   ...
                }
              
              to make sure things get torn down that have to be torn down and let the exception go to the top of the unit of work and probably to whatever drives the work unit. You can probably do better than logging the raw exception and moving on to the next work unit but you can do much worse. That is, you want a default "sloppy" error handling approach that's correct that you can do without thinking and avoid other kinds of "sloppy" coding encouraged by checked exception such as catching exceptions locally without doing the right thing globally.

              Occasionally though I have built something really sensitive, like an authentication filter for a web site which has at least 5 ways to log in and in that I have a hierarchy of exceptions and use checked exceptions heavily to document all the ways things can go wrong and felt like "the type system really has my back here" but that is like 5% of the Java I write.

        • theandrewbailey 19 minutes ago
          > but knowing exactly in which ways a function can fail is extremely helpful for building robust applications

          I've worked on Java apps that have failed in mysterious ways that no exception could explain. Meanwhile, the overhead of having to call out certain exceptions but not others in language syntax is a bit excessive.

          For example, decoding a byte array (or URL encoded form field) into a UTF-8 string means handling a theoretical UnsupportedEncodingException. What the fuck? How the hell can one have a JVM that doesn't support UTF-8? Why does my code have to boilerplate that will never run because there might be some broken-ass JVM out there that that doesn't support UTF-8? How did it launch a web server, safely load all the libraries, and accept a web request, and route it to my code without blowing up? "But the encoding scheme might change..." No, it won't change. It's always going to be UTF-8. It will always be UTF-8. If it's not, let it blow up.

          • Horffupolde 12 minutes ago
            Perhaps you are the trip you expected to blow up first.
    • pron 6 minutes ago
      These days, Java is mostly used in greenfield projects for software that has to be very reliable, very performant, and last for many years. So it's often the first choice for banking, telecom, finance, government, defence, manufacturing control, logistics and shipping, media streaming, retail, hospitality, healthcare etc.. It's usually not a first pick for more interesting and talked-about software, such as Python type checkers, JS bundlers, or TUI file managers.
      • astrodust 4 minutes ago
        Why not Go, Rust, or C#?
        • pron 3 minutes ago
          They lack in performance, stability (compatibility), observability (telemetry), productivity, or some combination thereof. They are chosen, of course (especially C#; Go and Rust are far behind), but not as much as Java.
        • Almondsetat 2 minutes ago
          Go and Rust have much worse tooling for enterprise-level collaboration
    • rwyinuse 23 minutes ago
      Java & Spring is a good choice whenever you want your application to work and be maintainable 10 years from now, without having to replace the framework and half of the libraries you used. I see few good reasons to ever use something with unstable ecosystem (like Javascript with NodeJS) over Java these days.
      • jjice 14 minutes ago
        Stability is a good point, although I am curious where JS and Node stand there now. They're not at the level of Java or .NET by any means, but the JS ecosystem has definitely begun to slowdown over the last few years. I've used express for the server and winston for logging for years and years now and they've very stable at this point.

        I guess I'm asking this as an open question: Where are we in the "move fast vs stable" spectrum with Node these days? Definitely not rock solid, but it's moving in that direction I feel.

      • ulimn 15 minutes ago
        Not just the time, but the environment, the OS as well. Where you can run JVM, there's a pretty good chance you can run your app.
    • pjc50 6 minutes ago
      JavaFX is fairly high up for "I want to run the same UI on Mac and Windows, and I don't want it to be an Electron web app in a box".
    • dorkypunk 1 hour ago
      When you are already familiar with it or work in a Java shop, there are better options if you are starting from scratch, but if you already have 50 guys that know Java it's a pretty big ask for all of them to switch.
    • skeletal88 39 minutes ago
      Same question for .net or C#

      Why should anyone use it over Java? Ms is hostile towards its developers, it creates new versions of things, deprecates previous versions, uses confusing naming for newer versions.. etc.

    • topbanana 1 hour ago
      When you work at a Java shop. Kotlin is much nicer if you have to run on the JVM but aren't restricted to Java.
    • kllrnohj 1 hour ago
      When you think a garbage collected language is a good fit for whatever you're building?
      • kfir 1 hour ago
        Wouldn't you go with golang in that case?
        • pron 5 minutes ago
          You could, but it's not as fast as Java, especially under heavy workloads, its telemetry is nowhere near as good, and it's much less popular.
        • ndriscoll 56 minutes ago
          Golang gives you none of nice features of a modern language while being about the same performance tier as Scala or Java, so there's basically no reason not to use Scala.
          • Thaxll 44 minutes ago
            Golang is faster and use way less memory than Java, never wonder why you never see Kubernetes controller / sidecar is Java?

            As for Scala it's pretty much a dead language, no one work with it and it's impossible to find dev for it.

            10 years ago I was moving Scala code back to regular Java.

            • ndriscoll 12 minutes ago
              Every job I've has has used different languages so I don't really understand the need to find a dev for a specific language. I went from network firmware in C to banking application servers in Scala and it took like 2 weeks to ramp up. Not a big deal. Now I write lower level networking stuff again in Go, which seems like its just worse than e.g. C-with-templates (and occasional classes) style C++ so I don't really understand why people like it.

              I think it used to be common to just look for smart people and assume they can run with whatever stack. Wasn't that the point of abstract algorithm questions etc. (basically an IQ test)?

            • weego 30 minutes ago
              It's sad - I spent a good 12 years writing Scala every day and it was the ideal language for my brain. Until it wasn't - sbt got too complex for it's own good, everything became "very smart" developers over-using implicit conversions, you couldn't find a project that wasn't an opinion war on cats vs whatever. It collapsed on the weight of it's own smugness.

              go and kotlin aren't it, gleam scratches the itch but I can't justify writing code that would impossible to hire for.

              scala situation is a real shame.

          • eklavya 46 minutes ago
            I ported a moderate sized java project to golang. Test suite runs order of magnitude faster now. There isn't much change in terms of the architecture. Pretty much the same algos and data structures. The whole dev tooling runs on a 16 gb mac without swapping now. I used vs code for both
            • ndriscoll 30 minutes ago
              IME they're both in a place where Rust is maybe ~40% faster for a decent CRUD web application server, but with go you need to write much lower level code to get there (e.g. using composable generic iterators will ruin your allocations, so it's all manual for loops). You can write idiomatic high level Scala and get the same performance. Which could be as simple as the go compiler offers no ability to force inlining and has way too low of a complexity threshold, but that basically makes reusable code unusable in high performance situations.

              The whole go team's philosophy tends to also revolve around assuming their users don't know what they're doing, which is annoying. Like an inline keyword: thinking you know better than me doesn't mean I'm not going to inline it; it means I'm going to manually write it inline myself in the code, and then think the language sucks because it's tedious, error-prone, and verbose. Or they tend to mark lots of stuff private for no reason, and e.g. with TLS 1.3 they just ignore your config because they think they know better, etc.

        • topbanana 1 hour ago
          I would, or C#
    • foolfoolz 48 minutes ago
      java is a great language for server side projects. it is actively maintained, the biggest issues with it have JEPs, and it’s very friendly to AI authors
    • eranation 20 minutes ago
      I wrote about it 13 years ago, some of it still stands true. https://news.ycombinator.com/item?id=5857495
    • orangesilk 1 hour ago
      Jruby is nice - runs Ruby on a Java Virtual Machine with full concurrency and Ahead Of Time compilation
    • soco 46 minutes ago
      Whoever works with, or chooses Java, is not doing it for the language itself, be it beautiful or not. Java has a huge ecosystem, from battle tested integrations to optimized images to build pipelines to whatever, so at the same you're buying access to all this world (yes, more than an environment). And of course transferable skills. I'm not saying Java is alone offering this, also not saying every feature is the best, but you can have them all, and even choose from different options.
      • rzmmm 12 minutes ago
        I use Java for hobby projects, I think it's design choices make it a nice minimalist language for "classic OOP" style: dynamic dispatch, encapsulation etc.

        Nowadays a lot of code is written with mostly procedural style with some functional characteristics, I wouldn't use Java for that.

      • marcosdumay 18 minutes ago
        Java's ecosystem is lingering since Oracle brought the language, and it's at the point where you should really look if the things you want to use are still in the state of the art, or if they felt behind every other language.

        And if you are starting from scratch, whatever part of the ecosystem you use, I'm not optimist on its situation improving with time.

  • arein3 1 hour ago
    Project Valhalla will go into Java 28 (next year, and preview version).

    Fingers crossed I'll manage to use null type safety in my lifetime.

    • pregnenolone 34 minutes ago
      > Project Valhalla will go into Java 28

      Unfortunatley without specialized generics and without the performance benefits that are supposed to come with it. They were too slow with Valhalla.

    • rf15 1 hour ago
      universal null type safety has sadly been discarded as a core concept of Valhalla in my Understanding; that being said, the proposals in Valhalla have null-safety as a side effect, but only under certain conditions.
      • MrBuddyCasino 37 minutes ago
        When (if) null safety ships, I‘m not sure I can justify using Kotlin any longer.

        Java simply got too nice.

        • hn8726 19 minutes ago
          Multiplatform and Compose come to mind as Kotlin differentiators. I agree rest of the language actually slowly falls behind
    • karussell 1 hour ago
      A first step of Valhalla that is ...
  • svcrunch 1 hour ago
    I've been using the Vector APIs for years now, and I'm still waiting for them to GA!

    They are useful for neural information retrieval (RAG, memory), which relies heavily on content vectorization and similarity matching using their dot products.

  • taspeotis 1 hour ago
    Knock knock

    Who's there?

    long pause

    Java

    • winrid 1 minute ago
      Don't put a 30gb heap on m4 boxes and you'll be okay
    • Betelbuddy 1 hour ago
      High Speed Trading team using Java looking puzzled ....

      https://lmax-exchange.github.io/disruptor/

      • Bluestein 1 hour ago
        This thing is a-ma-zing. It is truly a wonder. It is something to behold. The "Disruptor" pattern.-
    • lazystone 1 hour ago
      Oh, I see, jokes from 30 years ago!
      • HelloUsername 31 minutes ago
        The long pause between the knock and the answer took 30 years
      • Boereck 51 minutes ago
        Alternatively:

        Knock, knock

        who's there

        It's the 90s, wanting their jokes back

      • nairboon 54 minutes ago
        And still funny today, not all jokes survive that long.
    • azatom 1 hour ago
      It's on you bc it was (arguably but still) dead 17 years ago.

      edit: don't get me wrong, i am not here to hate java, but bc i am also ... hm necrophil :)

      • taspeotis 1 hour ago
        17 years is a rookie number. Take C# auto-properties, for example: 19 years ago!

        Now try asking, "When did Java get auto-properties?"

        • marginalia_nu 50 minutes ago
          News at 11.

          Language that runs on the explicit design philosophy of letting other languages experiment first and then incorporating their lessons learned once the dust has settled is late to implement a feature.

    • nsxwolf 1 hour ago
      G1 is now the default garbage collector in 27.
      • taspeotis 1 hour ago
        Sorry I only just set -xXx360NoScopexXx=4G to run that latest version without hitting OOM and you are right, it is indeed quite fast with G1.
        • paulddraper 40 minutes ago
          You misunderstand, xxx360NoScopexxx is now the default.
  • rf15 1 hour ago
    > Twelfth Incubator

    Are you sure this egg is actually viable?

    I mean, I'd love to see it, but...

    • papercrane 26 minutes ago
      The JDK team made a decision awhile ago to hold the Vector API until value types are final. That's why the API has been incubating so long.
  • aitoolcrux 4 minutes ago
    [flagged]