nipafx
A website to sharpen your Java skills - by Nicolai (aka nipafx), a Java enthusiast with a passion for learning and sharing, online and offline.
- Posts
- 409 from 27 Jun 2014 to 19 Oct 2026
- Posting
- weekly (45 in the last year)
- Kind
- personal blog
- Feed
- https://nipafx.dev/feed.xml
2026 38
- Modern Java - Past | Present | Future
- #events
- Talks
- #java‑next
- OpenJDK Bug Fixing, JavaOne, and JDK 28 - Inside Java Newscast #116
- #posts
- #videos
- #community
- #java‑28
- #openjdk
- Java Next
- #project‑amber
- #project‑babylon
- #project‑detroit
- #project‑leyden
- #project‑loom
- #project‑panama
- #project‑valhalla
- JSON API, Valhalla Progress, LTS ❤️ PQC - Inside Java Newscast #114
- #core‑libs
- Meta
- JDK 27 & Valhalla, Now! - Inside Java Newscast #113
- #java‑27
- Valhalla, Now!
- Avoiding Final Field Mutation
- #core‑lang
- #java‑26
- #libraries
- #migration
- You Must Avoid Final Field Mutation - Inside Java Newscast #110
- #deprecation
- Analysing Crashed JVMs - Inside Java Newscast #109
- Java 28 - Better Language, Better APIs, Better Runtime
- Towards Better Checked Exceptions - Inside Java Newscast #107
- Removal of ThreadPoolExecutor.finalize()
- LazyConstants in JDK 26 - Inside Java Newscast #106
- Carrier Classes; Beyond Records - Inside Java Newscast #105
- Java's Plans for 2026 - Inside Java Newscast #104
2025 32
- Java's 2025 in Review - Inside Java Newscast #103
- #java‑25
- All Features in Java 26 - Inside Java Newscast #102
- Java 26 Warns of Deep Reflection - Inside Java Newscast #101
- Q&A About My Work At Oracle's Java Platform Group
- Try the New Valhalla EA Build - Inside Java Newscast #100
- Consistent Behavior of new File("")
- Three G1 Improvements - Inside Java Newscast #99
- #performance
- All API Additions From Java 21 to 25
- #documentation
- #streams
- Structured Concurrency in Action
- #structured‑concurrency
- Upgrading From Java 21 To 25: All You Need To Know
- Java Architects Answer Your Questions - Inside Java Newscast #97
- HTTP/3 in Java - Inside Java Newscast #96
- Java Gets a JSON API - Inside Java Newscast #95
- Java 25 is ALSO no LTS Version - Inside Java Newscast #94
- Java 25 Encodes PEM - Inside Java Newscast #93
- Java 25 Brings 18 JEPs 😱 Inside Java Newscast #92
- Structured Concurrency Revamp in Java 25 - Inside Java Newscast #91
- JavaOne'25 Highlights - Inside Java Newscast #89
- #ai
- Maven
- New Null Checks in Inner Class Constructors
- Scoped Values in Java 24 - Inside Java Newscast #86
- #java‑24
- JDK 24 Deprecates Remote Debugging with jstat And jhsdb For Removal
- Java Language Evolution in 2025 - Inside Java Newscast #84
- Java's Plans for 2025 - Inside Java Newscast #83
- #project‑lilliput
2024 44
- Java 24 Performance Improvements & Deprecations - Inside Java Newscast #82
- JDK 24 Prepares Restricted Native Access
- Java 24 Language & API Changes - Inside Java Newscast #81
- Java 24 Stops Pinning Virtual Threads (Almost) - Inside Java Newscast #80
- #virtual‑threads
- Release Your (Java) Projects Like OpenJDK With Tip & Tail - Inside Java Newscast #79
- Advanced "Java 101"
- #java‑basics
- #on‑ramp
- Big News from Project Valhalla - Inside Java Newscast #77
- How to Read a JDK Enhancement Proposal - Inside Java Newscast #74
- Integrity by Default - Inside Java Newscast #73
- J ms
- #reflection
- Java and AI - A Structured Analysis
- JDK 23 Removes COMPAT Locale Provider
- #java‑23
- Java and AI? - Inside Java Newscast #72
- Why Update Data-Oriented Programming to Version 1.1?
- What Happened to Java's String Templates? Inside Java Newscast #71
- JDK 23 Changes Default Annotation Processing Policy
- When to use Data-Oriented Programming
- #architecture
- All Java 23 Features - Inside Java Newscast #70
- Separate Operations From Data - Data-Oriented Programming v1.1
- #pattern‑matching
- Make Illegal States Unrepresentable - Data-Oriented Programming v1.1
- Model Data, the Whole Data, and Nothing but the Data - Data-Oriented Programming v1.1
- Model Data Immutably and Transparently - Data-Oriented Programming v1.1
- #records
- Data-Oriented Programming in Java - Version 1.1
- Dop
- Module Imports in Java 23 - Inside Java Newscast #69
- Java Withers - Inside Java Newscast #67
- Java 23: Restoring the Balance with Primitive Patterns - Inside Java Newscast #66
- JDK 20-23: Support For Unicode CLDR Version 42
- #java‑20
- (Dirty?) Tricks in Java 22 - Inside Java Newscast #64
- #clean‑code
- Does Java 22 Kill Build Tools? - Inside Java Newscast #63
- #java‑22
- The Hottest Language You Didn't Have On Your Radar
- Java 22 Previews Statements Before super(...) and this(...) - Inside Java Newscast #62
- Java's Plans for 2024 - Inside Java Newscast #61
2023 31
- Java Highlights of 2023 - Inside Java Newscast #60
- #java‑8
- #turn‑of-the-year
- How Project Valhalla And JSpecify Can Kill NPEs
- #conversation
- Java, null, and JSpecify
- Java 22 Unpacking - Inside Java Newscast #59
- Java On The GPU - Inside Java Newscast #58
- Implementing New Java Stream Operations
- Better Java Streams with Gatherers - Inside Java Newscast #57
- Java Architects Answer Your Java Questions
- New Class-File API Will Make Java Updates Easier - Inside Java Newscast #56
- Java 21 Pattern Matching Tutorial
- #java‑21
- Modern Java in Action
- Upgrading From Java 17 To 21: All You Need To Know
- Java 21 is no LTS Version - Inside Java Newscast #52
- Java 21 - The Other Side - Inside Java Newscast #51
- All That is in Java 21?! 😱 - Inside Java Newscast #50
- Script Java Easily in 21 and Beyond - Inside Java Newscast #49
- Scaling Simply with Virtual Threads
- Save 10-20% Memory With Compact Headers - Inside Java Newscast #48
- Getting Rid Of Unused Variables (Finally) - Inside Java Newscast #46
- New (Sequenced) Collections In Java 21 - Inside Java Newscast #45
- #collections
- Java 20 🥱
- The Holy Grail of Java Performance - Inside Java Newscast #43
- Prepare Your Code Bases For Future Java - Inside Java Newscast #41
- Tools
- Java's Plans for 2023 - Inside Java Newscast #40
- #project‑galahad
2022 36
- 24 Java Features You Missed In 2022 - Inside Java Newscast #39
- #java‑18
- #java‑19
- From Idea to IDE - How Java Features Are Considered, Designed, And Shipped
- GraalVM In OpenJDK And More JavaOne Announcements - Inside Java Newscast #36
- #java‑17
- The Simplest Hello World - Inside Java Newscast #35
- The SolutionFactory To Java's Problems
- Data-Oriented Programming - Version 1.1
- Loom in the Java Ecosystem - Inside Java Newscast #34
- Java 19 in Action - Inside Java Newscast #33
- String Templates, JavaFX 19, Deserialization, and more at JavaOne - Inside Java Newscast #32
- #javafx
- #serialization
- Sequenced Collections, Purity, and more at JavaOne - Inside Java Newscast #31
- #lambda
- Java Q&A - Inside Java Newscast #30
- Data-Oriented Programming - Inside Java Newscast #29
- #patterns
- #techniques
- What is OpenJDK? - Inside Java Newscast #28
- Java 19 - The Best Java Release? - Inside Java Newscast #27
- Deconstructing Records in Pattern Matching - Inside Java Newscast #26
- News Grab Bag: Loom Virtual Threads, Lilliput, Pattern Matching, ... - Inside Java Newscast #25
- when And null In Pattern Matching - Inside Java Newscast #24
- How To Use switch In Modern Java
- #switch
- Virtual Thread Deep Dive - Inside Java Newscast #23
- All About JDK 18 - Inside Java Newscast #21
- Modern Java - Ask Me Anything
- State of Pattern Matching with Brian Goetz
- Configuring Maven For Compiled And Tested Code In Javadoc
- Compiled And Tested Code In Javadoc - Inside Java Newscast #20
- More Opinions On Optional
- Where to use Optional - Inside Java Newscast #19
- Java's Plans for 2022 - Inside Java Newscast #18
2021 41
- Project Loom Brings Structured Concurrency - Inside Java Newscast #17
- What Happens to Finalization in JDK 18? - Inside Java Newscast #15
- 11 Tricks From dev.java - Inside Java Newscast #14
- #generics
- Faster LTS and free JDK with Java 17 - Inside Java Newscast #12
- Better Random Number Generation in Java 17
- The State of Project Valhalla with Brian Goetz
- Fast and Secure Inter-process Communication on JDK 16 - Inside Java Newscast #11
- #java‑16
- Random Numbers and JDK Flight Recorder - Inside Java Newscast #9
- Incremental Evolution, Pattern Switches vs Visitor Pattern, and Wayland Support - Inside Java Newscast #8
- Visitor Pattern Considered Pointless - Use Pattern Switches Instead
- Handling null and Upgrading Past Java 8 - Inside Java Newscast #7
- The State of Project Panama with Maurizio Cimadamore
- Java Modules in Real Life
- The State of Project Loom with Ron Pressler
- Java 17: Features and Development - Inside Java Newscast #6
- Pattern Matching in Switches and Security Manager Deprecation - Inside Java Newscast #5
- 26 Hours of Java
- 5 Secret Java API Tricks and Record Semantics - Inside Java Newscast #4
- Why Java's Records Are Better* Than Lombok's @Data and Kotlin's Data Classes
- Rant
- Why Don't They Just... ?! The Deliberations Behind Evolving Java
- JUnit Pioneer - An Exploratory Mission to Jupiter And Beyond
- #junit‑pioneer
- Quicker Java and JDK 16 compatibility - Inside Java Newscast #3
- #vector
- Java Generics III - Wildcards
- Java Generics II - Bounded Type Parameters
- Vector API, Record Serialization, And Java 17 Release Schedule - Inside Java Newscast #2
- Java 16 Rundown, First Of Java 17 - Inside Java Newscast #1
- To Jupiter And Beyond - On An Exploratory Mission With JUnit Pioneer
- Definitive Guide To Java 16
- Patterns, switch, and Valhalla's Primitive Classes - JDK News #2
- Code-First Unix Domain Socket Tutorial
- Type Pattern Matching with instanceof
- Pattern Matching in Java
- Java's Quirks and Wrong (?) Defaults with Brian Goetz
- Pattern Matching Quartet - JDK News #1
- Sorting A React App Into Java's Folder Structure
- #js
2020 14
2019 20
- How We Upgraded From Java 8 And Why You Can (And Should) Do It Too
- Definitive Guide To Java 13
- #java‑13
- Improve Launch Times On Java 13 With Application Class-Data Sharing
- #java‑10
- #java‑12
- Definitive Guide To Switch Expressions In Java 13
- The JPMS Maturity Model
- Evolving Java With ––enable–preview aka Preview Language Features
- Definitive Guide To Text Blocks In Java 13
- Best Practices Considered Harmful
- Immutable Collections In Java - Not Now, Not Ever
- The Java Module System with Sander Mak
- Caliz III: Hashing scripts and background compilation
- Jakarta EE, javax, And A Week Of Turmoil
- Caliz II: Wrapping Graal AOT
- Caliz I: Wrapping JVM 11 and learning about Graal AOT
- Definitive Guide To Java 12
- Teeing Collector in Java 12
- Java 12 Experiments (Live Stream)
2018 29
- Utilities, Singletons and Dependency Injection - Effective Java, Items 3-5
- #book‑club
- Eleven Hidden Gems In Java 11
- Fun with var
- #default‑methods
- Var
- Scripting Java 11, Shebang And All
- Maven 3 / 4 / 5 with Robert Scholte
- Reactive HTTP/2 Requests And Responses In Java 11
- First Contact with Switch Expressions in Java 12
- Java 11 HTTP/2 API Tutorial
- Use Builders... Cautiously - Effective Java, Item 2
- Java 11: A New Dawn - Releases, Oracle JDK vs OpenJDK, and LTS
- All You Need To Know For Migrating To Java 11
- Static Factory Methods - Effective Java, Item 1
- Kicking off a series on Effective Java, Third Edition
- JUnit 5 Architecture or "What's Jupiter?"
- JUnit 5 Basics: @Test, Lifecycle, Assertions, Assumptions, And More
- JUnit 5 Conditions: @Enabled, @Disabled, Customized
- JUnit 5 - Dynamic Tests
- JUnit 5 Extension Model: How To Create Your Own Extensions
- JUnit 5 Setup in IntelliJ, Eclipse, Maven, and Gradle
- JUnit 5 - Parameterized Tests
- #junit‑5
- Unlocking Traits With var
- Tricks with var and anonymous classes (that you should never use at work)
- Unlocking Intersection Types With var
- How To Use Multi-release JARs To Target Multiple Java Versions
- Code-First Java 9 Tutorial
2017 24
- Goodbye 2017, Hello 2018
- Maven on Java 9 and later - Six Things You Need To Know
- First Contact With 'var' In Java 10
- First contact with var in Java 10
- Making JSR 305 Work On Java 9
- Code-First Java Module System Tutorial
- Unified Logging Of JVM Messages With The -Xlog Option
- Welcome, Java 9!
- Impressions of JavaZone 2017
- Five Command Line Options To Hack The Java Module System
- Planning Your Java 9 Update
- Jdeps
- To JAR Hell And Back
- Java 9 Migration Guide: The Seven Most Common Challenges
- A JDeps Tutorial - Analyze Your Project's Dependencies
- Java 9 Resources - Talks, Articles, Repos, Blogs, Books And Courses
- Optional Dependencies with requires static
- Parameterized Tests in JUnit 5
- Repackaging Exceptions In Streams
- Expert Java 8
- Why Elvis Should Not Visit Java
- SPJCN IV: Quo Vadis Scala
- Reflection vs Encapsulation
- Hello 2017!
2016 31
- Goodbye 2016, Sorry For Fucking Up
- SPJCN III: JavaOne 2016
- Publishing Snapshots With Gradle's maven-publish Plugin
- SPJCN II: What's Taking So Long?
- Rewrite, Architecture, Extensions Of JUnit 5
- What Future Java Might Look Like
- SPJCN I: Hello World
- Code Reviews At Disy - Observations
- #code‑review
- Code Reviews At Disy - How We Review
- The Ultimate Guide To Java 9
- Rebutting 5 Common Stream Tropes
- Code Reviews At Disy - Where We Were And What We Wanted
- Goodbye Disy, Hello SitePoint
- Oh No, I Forgot Stream::iterate!
- Java 9 Additions To Optional
- Comment Your &*☠# Code!
- Java 9 Additions To Stream
- How To Implement hashCode Correctly
- How To Implement equals Correctly
- JEEConf 2016
- JUnit 5
- CodeFX Leveled Up
- A Doomed Code Review
- Seven Reasons Against Blogging
- The Java Module System Beyond The Basics
- Building Atom On Gentoo
- Costs And Benefits Of Comments
- Implied Readability With requires transitive
- Beware Of findFirst() And findAny()
- Hello 2016!
2015 46
- Goodbye 2015!
- Jigsaw Hands-On Guide
- JDeps Maven Plugin 0.2 Released
- Six-Month Delay Of Java 9 Release
- JUnit Lambda - The Prototype
- JavaOne 2015: Under The Hood Of Project Jigsaw
- #impulse
- JavaOne 2015: Advanced Modular Development
- JavaOne 2015: Introduction to Modular Development
- JavaOne 2015: Prepare For JDK 9
- Will There Be Module Hell?
- JAR Hell
- Apache JMeter Tutorial
- A Taxonomy Of Comments
- Stream Performance - Your Ideas
- Stream Performance
- Java 8 SE Optional, a strict approach
- Interview About Comments On DZone
- Impulse: "Adventures On The Road to Valhalla"
- All About Project Jigsaw On InfoQ
- Thoughts On Comments
- Comment Your Fucking Code!
- #clean‑comments
- Casting In Java 8 (And Beyond?)
- The Features Project Jigsaw Brings To Java 9
- Motivation And Goals Of Project Jigsaw
- #project‑jigsaw
- LibFX 0.3.0 Released
- Libfx
- Transforming Collections
- JavaFX, Project Jigsaw and JEP 253
- First Release of JDeps Maven Plugin
- Impulse: "Crafted Design"
- LibFX 0.2.1 Released
- How Java 9 And Project Jigsaw May Break Your Code
- Getting Rid Of Anonymous Classes
- Interface Evolution With Default Methods – Part II: Interfaces
- Impulse: "Agile Architecture"
- Roll Your Own Pirate-Elvis Operator
- Test Collection Implementations with Guava
- Interface Evolution With Default Methods - Part I: Methods
- Value-Based Classes
- Running Android Emulator With HAXM On Thinkpad T440p
- Everything You Need To Know About Default Methods
- New Javadoc Tags @apiNote, @implSpec, and @implNote
- Hello 2015!
2014 21
- Goodbye 2014!
- Instances of Non-Capturing Lambdas
- Multiple Return Statements
- Don't Remove Listeners - Use ListenerHandles
- LibFX 0.2.0 Released
- JavaFX Sources in Eclipse
- Impulse: "Lambdas In Java: A Peek Under The Hood"
- Serialize Optional
- The Serialization Proxy Pattern
- Concepts of Serialization
- Why Isn't Optional Serializable?
- The Design of Optional
- Intention Revealing Code With Optional
- #optional
- Impulse: "Architecture - The Lost Years"
- The Decorator Pattern With Default Methods
- Impulse: "Workflows of Refactoring"
- How The Decorator Pattern Saved My Day
- CodeFX Up And Running
- LibFX 0.1.1 Released
- Foobar