Java 26 is here
Android, Java, and the Oracle legacy
- Android uses its own runtime (ART/Dalvik) and DEX bytecode; it can ingest JVM bytecode but is not a full OpenJDK JVM.
- Some say Android only cherry-picks OpenJDK since Nougat and lacks full bytecode equivalence; others note Google internally uses full OpenJDK on server-side.
- Lawsuit fallout: several argue Google froze Java language levels after Oracle’s actions, then pushed Kotlin as primary.
- Result: Android often lags mainstream Java (e.g., long delay for lambdas, now a Java 17 subset), making library compatibility painful.
Virtual threads, green threads, and “function coloring”
- Many praise virtual threads as Java’s “async without colored functions”: blocking APIs stay synchronous while getting async-like scalability.
- Discussion clarifies “function coloring” (async vs sync call graphs) and differences between stackless vs stackful coroutines.
- Some note virtual threads don’t entirely eliminate pinning problems or misuse of blocking APIs, but remaining pitfalls are narrow (e.g., FFI).
Applet removal and legacy APIs
- JEP 504 (removing Applet API) is widely welcomed; Java browser plugins and WebStart are remembered as painful but historically important.
- A minority regret removal because JApplet-based code still exists and can run via IDE plugins or WASM.
Language evolution, culture, and frameworks
- Long-time users say modern Java is far nicer: records, pattern matching, sealed types, streams, virtual threads, better GC.
- Others claim “you don’t code Java, you code Spring Boot,” criticizing annotation-heavy, enterprise patterns and painful upgrades.
- Counterpoint: the Java ecosystem is diverse; many teams avoid Spring entirely or use lighter frameworks (Quarkus, Micronaut, Helidon, Javalin, Jooby) or Jakarta EE.
- Persistent complaint: “Java culture” (over-OO, factories, DI obsession) bleeds into other languages; others argue composition, simpler styles, and more procedural code are now common.
Java vs Go, .NET, TypeScript, Python
- Several compare Java favorably to Go for large “industry” codebases: richer typing, immutability patterns, better GC, deeper observability (JMX, JFR).
- Others report concrete cases where Go web services used far less memory and CPU than Java equivalents; they attribute differences partly to frameworks and GC pressure.
- .NET/C# is seen by some as ahead in language features and compiler/tooling; others say JVM GC and cross-platform reach are stronger.
- TypeScript is preferred for full-stack web and shared types, but criticized for chaotic tooling and NPM security vs Java’s curated Maven Central.
Tooling, build, and deployment pain
- Strong consensus that Java’s build/deploy story is weak: Maven/Gradle are slow or complex; jlink/jpackage and Graal native are powerful but hard and slow.
- Mill and jbang are cited as promising alternatives; many want a “java package”-style simple bundling flow akin to Go’s single-binary builds.
- Packaging and runtime-version headaches are blamed for Java’s decline on the desktop and for CLI tools.
Projects Valhalla and Vector API
- Valhalla (value types) is seen as massively important but comically slow; some joke you could measure cosmic timescales in “nano-Valhallas.”
- Vector API remains incubating, waiting on Valhalla; some are frustrated, others note recent real progress and backward-compatibility constraints.
Impact on other JVM languages
- Non-Java JVM languages benefit mainly from runtime improvements (GC, virtual threads, new APIs).
- Clojure and Kotlin can already tap virtual threads; some note many “new” Java features are things Kotlin had syntactically earlier.