Java Arrives Late. On Purpose
Java arrives late.
On purpose.
Being first is a timestamp. Being right is a reputation.
Java is a language that arrives late to things. Let me prove it: generics, lambdas, records, virtual threads. Every one of them existed somewhere else, often for decades, before Java shipped it.
Now you might be thinking:
"Sattu, are you trashing Java?"
Quite the opposite. To me, this is one of Java's biggest advantages.
The receipts
Before I make the case, let me show that "late" is not an exaggeration.
| Feature | Who had it first | When Java shipped it |
|---|---|---|
| Generics | Ada (1983), C++ templates in the early 1990s | Java 5 · 2004 |
| Lambdas | Lisp (1958), Scala, C# 3.0 (2007) | Java 8 · 2014 |
| Records | Scala case classes, Kotlin data classes | Java 16 · 2021 |
| Virtual threads | Erlang processes (1986), Go goroutines (2009) | Java 21 · 2023 |
Lambdas reached Java more than half a century after Lisp had them. Lightweight concurrency reached Java fourteen years after Go made it fashionable. If there were a prize for being first, Java would not even be on the shortlist.
The company that perfected arriving late
Think of a company that is an expert at arriving late: Apple.
What is the advantage of arriving later? You get to avoid the mistakes everyone else already made, and you get them for free.
"Every language is a production language"
A good friend of mine says Java has always been a production language.
"Yeah, but every language is a production language."
True. Every language is made to put things in production. But not every ecosystem has the culture of looking at production before shipping something. In Java, that was always priority number zero.
That culture is not just a vibe. It is built into the release process. Since JDK 12, big language changes ship first as preview features: fully implemented, but switched off unless you explicitly opt in. Real developers use them on real code, report what hurts, and the design changes before anything becomes permanent.
# a preview feature does nothing unless you ask for it
javac --release 21 --enable-preview Main.java
java --enable-preview Main
Opt in, try it, push back. Only then does it become part of the language you have to live with forever.
| Feature | Time in preview | Outcome |
|---|---|---|
| Records | JDK 14, JDK 15 | Final in JDK 16 |
| Virtual threads | JDK 19, JDK 20 | Final in JDK 21 |
| Pattern matching for switch | Four rounds, JDK 17 to 20 | Final in JDK 21 |
| String templates | JDK 21, JDK 22 | Withdrawn in JDK 23 |
Look at that last row. String templates were implemented, shipped as a preview, used by people, and then pulled out because the design was not right yet. Most ecosystems would have shipped it and patched it later. Java would rather take it back than lock in a mistake for the next twenty years.
The practical consequence? Generics, lambdas, records, virtual threads and plenty of others went in without drama. I have been doing this for over 25 years, and I cannot recall a single story of "records blew up in prod because they got the implementation wrong."
record Order(String id, BigDecimal amount) {}
List<Order> orders = loadOrders();
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
orders.forEach(order -> executor.submit(() -> process(order)));
}
All four late arrivals in five lines: a record, a generic list, lambdas, and virtual threads. Boring code. That is the compliment.
"The fastest way to lose trust in production is to be first with something half-finished."
A lesson learned in production, not in a keynote
Four things this argument glosses over
Late has a real cost. While Java waited, developers who wanted concise syntax went elsewhere. Kotlin became Google's preferred language for Android in 2019 largely because Java took its time. Patience is a strategy, but the market does not always wait for you.
Careful is not the same as flawless. Generics came with type erasure, a compromise made for backward compatibility that Java developers still trip over today. And java.util.Date was bad enough that the platform eventually shipped an entirely new date and time API in Java 8 to replace it.
Slow can look like stagnation. Between Java 6 and Java 7 there was a gap of about five years. That stretch is exactly when a lot of people decided Java was finished. The six-month release train that started in 2018 fixed the cadence, but the perception took longer to repair.
Arriving late only works if you actually learn. Being second is not a virtue by itself. It is only an advantage if you study why the first attempts failed. Java gets credit here not for being late, but for using the time well.
The career lesson hiding in a release calendar
I don't think Java will ever race to ship something before other ecosystems. And to me, that is a career lesson too.
Do I really need to rush to be the first to do something? First to adopt the new framework, first to rewrite the system, first to have an opinion on the latest launch? I'm not so sure. In my experience, the people and teams that last are rarely the ones who got there first. They are the ones whose work still runs, quietly, years after the excitement moved on.
Looking at a language with over 30 years in the market, still evolving like few others, I think they know what they are doing.
"Nobody remembers who shipped it first. Everybody remembers who shipped it broken."
Earned opinion, not a benchmark leaderboard
Here you will find all about Technology, Food, Travel and about our life.
Search This Blog
Blog Archive
- September 2026 (1)
- August 2026 (1)
- July 2026 (3)
- June 2026 (2)
- April 2026 (1)
- December 2025 (1)
- October 2025 (1)
- August 2025 (1)
- July 2025 (1)
- February 2025 (1)
- October 2022 (1)
- November 2019 (1)
- June 2019 (1)
- July 2016 (1)
- February 2009 (1)
-
I wrote my first programs in Notepad. Not VS Code, not Sublime, not even a basic IDE. Plain old Notepad. No IntelliSense. No Stack Overflow...
-
The Aggregator Trap How Food Delivery Platforms Are Destroying India’s Restaurant Ecosystem A Wake-Up Call for India’s Food In...
-
เคाเคฃเค्เคฏ Ancient Wisdom · Modern Ruthlessness Stop Being the Bigger Person. Chanakya ...
Java Arrives Late. On Purpose
arrives-late.sh sattu@arch-lab :~/java $ ./when-did-java-get-it --compare=everyone-else > checking release notes since 1995... ...
Comments
No comments yet. Be the first to share your thoughts!
Leave a comment — enter your name and message below. The URL field is optional and can be left blank.