# Report card: Java 19 and the end of Kotlin

DevFeed: [Report card: Java 19 and the end of Kotlin](<https://devfeed.tech/articles/report-card-java-19-and-the-end-of-kotlin-20968.md>)

Original publisher: [Read original article](<https://jakewharton.com/report-card-java-19-and-the-end-of-kotlin/>)

Published: 2022-09-20T00:00:00Z

Content type: opinion

Language: en

Sources: [Jake Wharton](<https://devfeed.tech/sources/jake-wharton.md>)

Topics: [Java](<https://devfeed.tech/topics/java.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [developer](<https://devfeed.tech/tags/developer.md>), [feature](<https://devfeed.tech/tags/feature.md>), [future](<https://devfeed.tech/tags/future.md>), [java](<https://devfeed.tech/tags/java.md>), [java-language](<https://devfeed.tech/tags/java-language.md>), [jdk](<https://devfeed.tech/tags/jdk.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [project-valhalla](<https://devfeed.tech/tags/project-valhalla.md>), [report](<https://devfeed.tech/tags/report.md>), [update](<https://devfeed.tech/tags/update.md>), [valhalla](<https://devfeed.tech/tags/valhalla.md>)

## AI overview

The article reviews how Java 19 compares with predictions made three years earlier, grading features such as local methods, text blocks, records, sealed hierarchies, type patterns, and virtual threads. It concludes that Java remains strong, Kotlin has continued to evolve, and developers should use the latest JDK rather than wait for an OpenJDK LTS release.

## Source excerpt

Three years ago I gave the talk "What's new in Java 19: The end of Kotlin?" which forecasted what a future Java language would look like in September 2022 when Java 19 was released. Check your calendars, folks. It's September 2022 right now and Java 19 was released today! As expected my predictions were not perfect, but I'm pretty happy with the results. Let's check in with each feature and see how my predictions fared report-card style1. Local methods This feature allows for methods to be declared inside of other methods making them effectively private to that method. public static boolean anyMatch(Graph graph, Predicate<Node> predicate) { var seen = new HashSet<Node>(); boolean hasMatch(Node node) { if (!seen.add(node)) return false; // already seen if (predicate.test(node)) return true; // match! return node.getNodes().stream().anyMatch(n -> hasMatch(n)); } return hasMatch(getRoot()); } Grade: F 🔴 Working support for local methods was added to a branch in Project Amber in October 2019. It seemed like a slam dunk, but a JEP for the feature was never created. The branch still sits in the Project Amber repo unchanged in three years. If I had to guess, all eyes in Amber are focused on pattern matching and its related features. Hopefully someday local methods can be picked back up as a proposed feature. Text blocks A multiline string literal for when one line just isn't enough. System.out.println(""" SELECT * FROM users WHERE name LIKE 'Jake %' """); Grade: A 🟢 Delivered in Java 15. Records A read-only type that exists solely for carrying data with strong, semantic names. record Person(String name, int age) { } Grade: A 🟢 Delivered in Java 16. Sealed hierarchies Define the list of permitted subtypes of your class or interface and prevent any others. sealed interface Developer { } record Person(String name, int age) extends Developer { } record Business(String name) extends Developer { } Grade: A 🟢 Delivered in Java 17. Type patterns Declare a new name to bind when a t