Java 25 LTS · Modern Java

Write Java that's clean, fast and built to last.

Shaun is a practical hub for Java developers — from your first main method to virtual threads, Spring Boot microservices and production-ready tooling.

Start the roadmapExplore topics
// Modern Java: records, sealed types, pattern matching
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double side) implements Shape {}

double area(Shape s) {
  return switch (s) {
    case Circle(var r)    -> Math.PI * r * r;
    case Square(var side) -> side * side;
  };
}

void main() {
  try (var ex = Executors.newVirtualThreadPerTaskExecutor()) {
    ex.submit(() -> IO.println("Hello from Shaun ☕"));
  }
}

Core topics

Everything a working Java developer touches, organised so you can go deep where it matters.

🧱

Language fundamentals

OOP, generics, collections, exceptions, records, sealed classes and pattern matching.

⚡

Concurrency

Virtual threads, structured concurrency, CompletableFuture and the java.util.concurrent toolkit.

🌱

Spring Boot

REST APIs, dependency injection, Spring Data, security and observability out of the box.

🛠️

Build tooling

Maven and Gradle, dependency management, multi-module builds and reproducible releases.

🧪

Testing

JUnit 5, Mockito, AssertJ and Testcontainers for confident, fast feedback loops.

🚀

Performance & JVM

Garbage collectors, JIT, profiling with JFR, GraalVM native images and memory tuning.

Developer roadmap

A step-by-step path from beginner to production engineer.

Set up your environment

Install a JDK (Temurin 25), pick an IDE like IntelliJ IDEA or VS Code, and learn the java launcher.

Master the language

Syntax, types, OOP, the Collections API, Streams and lambdas.

Build and test

Structure projects with Maven or Gradle and write tests with JUnit 5 from day one.

Ship web services

Build REST APIs with Spring Boot, connect to databases with JPA or JDBC, and secure them.

Run in production

Containerise with Docker, monitor with Micrometer & OpenTelemetry, and tune the JVM.

Best practices

Habits that keep Java codebases healthy as they grow.

  • Prefer immutability — use records and List.of() for value data.
  • Return Optional instead of null for absent results.
  • Use try-with-resources for anything that must be closed.
  • Keep methods small and classes focused on one responsibility.
  • Stay on an LTS JDK and upgrade regularly.
  • Automate formatting and static analysis in CI.