Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaOne Java 25

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Jeanne Boyarsky Jeanne Boyarsky
March 17, 2026
3

JavaOne Java 25

Avatar for Jeanne Boyarsky

Jeanne Boyarsky

March 17, 2026
Tweet

Transcript

  1. https://linktr.ee/jeanneboyarsky Agenda - Examples/Questions 5 • Compact source files (25)

    • Instance main (25) • IO class (25) • Flexible constructor bodies (25) • Module imports (25) • Bonus: JavaDoc (23) • Unnamed variables/patterns (22) • Multi file source code (22)
  2. https://linktr.ee/jeanneboyarsky Agenda - Examples/Questions 6 • Sealed classes (17) •

    Instance of/switch patterns (14-21) • Virtual Threads (21)
  3. @jeanneboyarsky Hello JavaOne 25 9 public class Hello { public

    static void main( String[] args) { System.out.println( "Hello JavaOne!"); } } void main() { IO.println( "Hello JavaOne!"); } • Compact class files • Instance main • IO class
  4. @jeanneboyarsky Can use any of these 25 10 void main()

    {} void main(String[] args) {} void main(String... args) {} static void main() {} public void main() {} public void main(String[] args) {} + more If two, calls one with args
  5. @jeanneboyarsky Prologue Rules 25 12 • Can reference constructor params

    • Cannot reference instance methods • Cannot reference instance variables • Except for setting initial value of unitialized one
  6. @jeanneboyarsky Constructor Flow - What prints? 25 13 public class

    Bridge { { IO.print("i"); } public Bridge() { IO.print("p"); this(1); IO.print("e"); } public Bridge(int num) { IO.print("n"); } public void main() { new Bridge(); } } pinepine
  7. @jeanneboyarsky Unnamed Variables 22 14 • _ (single underscore) is

    valid variable name • Restrictions • Cannot read • Cannot write • Can define multiple in same scope • Useful for: catch, lambda, pattern matching, etc
  8. @jeanneboyarsky Unnamed Variables 22 15 // good String _ =

    "init"; String _ = "again"; // no good _ = "write"; IO.println(_); String _;
  9. @jeanneboyarsky Scoped Values 25 16 static final ScopedValue<List<String>> SESSIONS =

    ScopedValue.newInstance(); void main() { var sessions = List.of("Java 25", "AI"); ScopedValue.where(SESSIONS, sessions).run( () -> { attend(); }); } void attend() { IO.println(SESSIONS.get()); } immutable scoped data
  10. @jeanneboyarsky Module Imports 25 18 // imports over 50 packages

    import module java.base; import java.util.List; vs import java.util.*; vs import module java.base;
  11. @jeanneboyarsky Module Imports Shadowing 25 19 Code Type Imports import

    module.java.sql; Module imports 2 direct packages 3 transitive packages (via requires transitive) 1 service (Driver) import java.sql.*; Wildcard/package import 50+ classes import java.sql.Date; Import single class 1 class
  12. @jeanneboyarsky Bonus: JavaDoc 23 20 /// While /** */ uses

    HTML, /// triple slashes use **markdown** /// /// commonmark.org format /// - on odd days, … /// - on even days, … /// /// @return an important number
  13. @jeanneboyarsky Bonus: Multi-File Source-Code 22 21 java Conference.java public class

    Conference { public Conference(List<Speaker> speakers) { } }
  14. @jeanneboyarsky Module 1 - Question 1 Which lines have compiler

    errors? 1: void main(String[] _) { 2: double _ = 0.00; 3: String _ = null; 4: IO.println(_); 5: boolean isNull = _ == null; 6: } 22 D. Line 4 E. Line 5 A. Line 1 B. Line 2 C. Line 3
  15. @jeanneboyarsky Module 1 - Question 1 Which lines have compiler

    errors? 1: void main(String[] _) { 2: double _ = 0.00; 3: String _ = null; 4: IO.println(_); 5: boolean isNull = _ == null; 6: } 23 D. Line 4 E. Line 5 A. Line 1 B. Line 2 C. Line 3 A, D, E
  16. @jeanneboyarsky Module 1 - Question 2 Which types are are

    immutable in SV? static final ScopedValue<XXX>> SV = ScopedValue.newInstance(); 24 C. LocalDateTime D. String A. List B. List<String>
  17. @jeanneboyarsky Module 1 - Question 2 Which types are are

    immutable in SV? static final ScopedValue<XXX>> SV = ScopedValue.newInstance(); 25 C. LocalDateTime D. String A. List B. List<String> C, D
  18. @jeanneboyarsky Module 1 - Question 3 What are true of

    line 5? 1: import java.util.*; 2: import jeanne.List; 3: import module java.base; 4: 5: void main(List list) {} 26 A. The import on line 1 is used for line 5 B. The import on line 2 is used for line 5 C. The import on line 3 is used for line 5 D. This program will run
  19. @jeanneboyarsky Module 1 - Question 3 What are true of

    line 5? 1: import java.util.*; 2: import jeanne.List; 3: import module java.base; 4: 5: void main(List list) {} 27 A. The import on line 1 is used for line 5 B. The import on line 2 is used for line 5 C. The import on line 3 is used for line 5 D. This program will run B
  20. @jeanneboyarsky Module 1 - Question 4 What is the output?

    private class Blue { { IO.print("i"); } private Blue() { IO.print("c"); this(“l"); } 28 Blue(String s) { IO.print(s); super(); } void main() { new Blue(); } } C. Does not compile D. Does not run A. cli B. clicli
  21. @jeanneboyarsky Module 1 - Question 4 What is the output?

    private class Blue { { IO.print("i"); } private Blue() { IO.print("c"); this(1); } 29 Blue(int num) { IO.print(num); super(); } void main() { new Blue(); } } C. Does not compile D. Does not run A. cli B. clicli D
  22. @jeanneboyarsky Module 1 - Question 5 Which variables can be

    replaced by _? void main(String[] args) { enum Suit { HEART, DIAMOND, SPADE, CLUB }; enum Symbol { ACE, JACK, QUEENS, KING}; record Card(Suit suit, Symbol symbol) {} var card = new Card(Suit.HEART, Symbol.ACE); try { if (card instanceof Card(Suit suit, Symbol symbol)) IO.println(suit); } catch (NullPointerException e) { IO.print("party!"); } } 30 C. symbol D. e A. args B. card
  23. @jeanneboyarsky Module 1 - Question 5 Which variables can be

    replaced by _? void main(String[] args) { enum Suit { HEART, DIAMOND, SPADE, CLUB }; enum Symbol { ACE, JACK, QUEENS, KING}; record Card(Suit suit, Symbol symbol) {} var card = new Card(Suit.HEART, Symbol.ACE); try { if (card instanceof Card(Suit suit, Symbol symbol)) IO.println(suit); } catch (NullPointerException e) { IO.print("party!"); } } 31 C. symbol D. e A. args B. card C, D
  24. @jeanneboyarsky Sealed classes 17 public abstract sealed class Seasons permits

    Fall, Spring, Summer, Winter { } final class Fall extends Seasons {} final class Spring extends Seasons {} final class Summer extends Seasons {} final class Winter extends Seasons {} Seasons Fall Spring Summer Winter 33
  25. @jeanneboyarsky Subclass modifiers 34 17 Modifer Meaning final Hierarchy ends

    here non-sealed Others can subclass sealed Another layer
  26. @jeanneboyarsky Sealed interface 17 public sealed interface TimeOfDay permits Morning,

    Afternoon, Evening { boolean early(); } public non-sealed class Morning implements TimeOfDay { public boolean early() { return true; } } public non-sealed class Afternoon implements TimeOfDay { public boolean early() { return false; } } public record Evening(int hour) implements TimeOfDay { public boolean early() { return false; } } Records are implicitly final 35
  27. @jeanneboyarsky Using Pattern Matching 36 21 return switch (obj) {

    case null -> ""; case Integer i when i >= 21 -> "can gamble"; case Integer i -> "too young to gamble"; case String s when "poker".equals(s) -> "table game"; case String s when "craps".equals(s) -> "table game"; case String s -> "other game"; default -> throw new IllegalArgumentException("unexpected type"); }; guard clause pattern variable null allowed Still Null Pointer if don’t specify case null
  28. @jeanneboyarsky Order matters 37 21 return switch (obj) { case

    null -> ""; case Integer i -> "too young to gamble"; case Integer i when i >= 21 -> "can gamble”; // DOES NOT COMPILE case String s -> "other game"; default -> throw new IllegalArgumentException("unexpected type"); }; Order like catching exceptions!
  29. @jeanneboyarsky Enums 38 21 enum Suit { HEART, DIAMOND, CLUB,

    SPADE; } String symbol(Suit suit) { return switch (suit) { case HEART -> "♥"; case Suit.DIAMOND -> "♦"; case CLUB -> "♣"; case Suit.SPADE -> "♠"; }; } Fails compilation if miss one since no default
  30. https://linktr.ee/jeanneboyarsky Record Patterns 39 enum Suit { HEART, DIAMOND, CLUB,

    SPADE; } enum Rank { NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7 NUM_8, NUM_9, NUM_10, JACK, QUEEN, KING, ACE; } record Card(Suit suit, Rank rank) { } if (card instanceof Card c) { System.out.println(c.suit()); System.out.println(c.rank()); } if (card instanceof Card(Suit suit, Rank rank)) { System.out.println(suit); System.out.println(rank); } 21 Deconstructed
  31. https://linktr.ee/jeanneboyarsky Nested Record Patterns 40 record MultiDeck(int deckNum, Card card)

    { } if (multi instanceof MultiDeck(int deckNum, Card(Suit suit, Rank rank))) { System.out.println(deckNum); System.out.println(suit); System.out.println(rank); } 21
  32. https://linktr.ee/jeanneboyarsky Switch pattern matching 41 switch(card) { case Card(Suit suit,

    Rank rank) when suit == Suit.HEART -> System.out.println("Heart"); case Card c -> System.out.println("other"); } 21
  33. https://linktr.ee/jeanneboyarsky Switch pattern matching 42 String str = ""; switch

    (str) { case "heart" -> System.out.println("heart"); } Card card = new Card(Suit.HEART, Rank.NUM_2); switch (card) { case Card(Suit suit, Rank rank) when suit == Suit.HEART -> System.out.println("Heart"); case Card c -> System.out.println("other"); } 21 Must be exhaustive if using “when”
  34. https://linktr.ee/jeanneboyarsky What can’t you do? 43 • In switch(x), x

    still can’t be • boolean • float • double • long • Expanding non-records (coming ?) 21
  35. https://linktr.ee/jeanneboyarsky Why we need threads 45 Program Do calculation and

    call REST API Do calculation and call REST API CPU Network I’m bored… I’m waiting for a reply
  36. https://linktr.ee/jeanneboyarsky Why we need virtual threads 46 Program Do calculation

    and call REST API Proceed CPU Network Still bored… Still waiting for a reply Platform Thread 1 Platform Thread n Do calculation and call REST API Send to threads
  37. https://linktr.ee/jeanneboyarsky Virtual Thread 1 With virtual threads 47 Program Do

    calculation and call REST API Proceed CPU Network Thanks for the work! Me too! Platform Thread 1 Platform Thread n Send to threads Virtual Thread t Do calculation and call REST API Virtual Thread t+1 Do calculation and call REST API Virtual Thread x Do calculation and call REST API
  38. https://linktr.ee/jeanneboyarsky Comparing 49 Platform (Traditional) Thread Virtual Thread Heavyweight Lightweight

    Tied to OS threads Runs on OS thread but doesn’t monopolize Often pooled Often shortlived Instance of java.lang.Thread Instance of java.lang.Thread 21
  39. https://linktr.ee/jeanneboyarsky Fill in the blank 50 try (ExecutorService service =

    Executors._________) { service.submit(() -> doStuff()); } Examples: • newSingleThreadExecutor() • newFixedThreadPool(5) • newCachedThreadPool() • newVirtualThreadPerTaskExecutor() 21
  40. https://linktr.ee/jeanneboyarsky Autocloseable 51 Method Java 21 shutdown() No more tasks,

    but finish ones have shutdownNow() Stop tasks in progress close() Calls shutdown by default 19
  41. @jeanneboyarsky Module 2 - Question 1 How many compiler errors

    are in this code? public sealed class Phone { class IPhone extends Phone { } class Android extends Phone { } } 53 C. 2 D. 3 A. 0 B. 1
  42. @jeanneboyarsky Module 2 - Question 1 How many compiler errors

    are in this code? public sealed class Phone { class IPhone extends Phone { } class Android extends Phone { } } 54 C. 2 D. 3 A. 0 B. 1 C (extending classes needed to be sealed or final)
  43. https://linktr.ee/jeanneboyarsky Module 2 - Question 2 55 How many lines

    do you need to remove to make this code compile? double odds(Object obj) { return switch (obj) { case String s -> throw new IllegalArgumentException("unknown game"); case String s when "blackjack".equals(s) -> .05; case String s when "baccarat".equals(s) -> .12; case Object o -> throw new IllegalArgumentException("unknown game"); default -> throw new IllegalArgumentException("known game"); }; } A. 0 B. 1 C. 2 D. 3
  44. https://linktr.ee/jeanneboyarsky Module 2 - Question 2 56 How many lines

    do you need to remove to make this code compile? double odds(Object obj) { return switch (obj) { case String s -> throw new IllegalArgumentException("unknown game"); case String s when "blackjack".equals(s) -> .05; case String s when "baccarat".equals(s) -> .12; case Object o -> throw new IllegalArgumentException("unknown game"); default -> throw new IllegalArgumentException("known game"); }; } A. 0 B. 1 C. 2 D. 3 C String s & Object o or default
  45. @jeanneboyarsky Module 2 - Question 3 What is true about

    this class? class Sword { int length; public boolean equals(Object o) { if (o instanceof Sword sword) { return length == sword.length; } return false; } // assume hashCode properly implemented } 57 C. equals() does not compile A. equals() is correct B. equals() is incorrect
  46. @jeanneboyarsky Module 2 - Question 3 What is true about

    this class? class Sword { int length; public boolean equals(Object o) { if (o instanceof Sword sword) { return length == sword.length; } return false; } // assume hashCode properly implemented } 58 C. equals() does not compile A. equals() is correct B. equals() is incorrect A
  47. @jeanneboyarsky Module 2 - Question 4 What does printLength(3) print?

    class Sword { int length = 8; public void printLength(Object x) { if (x instanceof Integer length) { length = 2; } System.out.println(length); } } 59 C. 8 D. Does not compile A. 2 B. 3
  48. @jeanneboyarsky Module 2 - Question 4 What does printLength(3) print?

    class Sword { int length = 8; public void printLength(Object x) { if (x instanceof Integer length) { length = 2; } System.out.println(length); } } 60 C. 8 D. Does not compile A. 2 B. 3 C
  49. https://linktr.ee/jeanneboyarsky Module 2 - Question 5 61 What is true

    doStuff() at line v1? try (var service = Executors.newVirtualThreadPerTaskExecutor()) { service.submit(() -> doStuff()); } // line v1 A. doStuff() may be running B. doStuff() was killed C. doStuff() completed D. None of the above 21
  50. https://linktr.ee/jeanneboyarsky Module 2 - Question 5 62 What is true

    doStuff() at line v1? try (var service = Executors.newVirtualThreadPerTaskExecutor()) { service.submit(() -> doStuff()); } // line v1 A. doStuff() may be running B. doStuff() was killed C. doStuff() completed D. None of the above 21 C
  51. @jeanneboyarsky Module 2 - Question 6 I learned a lot

    today and I’m ready to code A. True B. False Lab:https://github.com/boyarsky/2026-java-one Note that longer than will have time for. Can finish on own or during my Wed 3pm hack session 63