Posts

Tooling: IntelliJ, jshell, and the Build Pipeline

You've made it to the end of the bridge. Post 1 gave you the static-type mindset, post 2 the object model and collections, post 3 dependency management — and now the part nobody warns Python developers about: in Java, the toolchain is a bigger part of the job than the language. In Python, the interpreter is the toolchain. You write app.py , run python app.py , and you're done. Packaging, docs, profiling, and the REPL are afterthoughts you bolt on later. In Java, the equivalent surface is a whole pipeline of small, sharp tools that ship with the JDK — plus an IDE culture and a build-pipeline culture that Python simply doesn't have. This post walks the full loop: edit → compile → run → debug, the REPL you didn't know Java had, the CLI toolkit, the IDE everyone actually uses, and the build pipeline that turns source into a shippable artifact. Lab honesty, stated up front. Everything shown as terminal output below is real output from this lab machine (Temurin JDK ...

The JVM Ecosystem: Maven Central, Spring, and What's Standard

You know the Python landscape by heart: pip installs from PyPI, venv isolates environments, the standard library covers files/dates/JSON/HTTP, and when you need a web service you reach for Django or Flask, pytest for tests, and the logging module when things get serious. None of that knowledge transfers name-for-name — but every one of those needs has a Java answer, and this post is the map. Here's the honest version of the map, in one paragraph. Java's standard library ships with the JDK — collections, file I/O, dates, and even an HTTP client come free with every install. Maven Central is the PyPI of the JVM : a public artifact repository where every library has exact coordinates, and you download them with a build tool instead of pip . The build tool is usually Maven or Gradle (think pip + setuptools / pyproject.toml combined). A JAR is the distribution format — a zip with a manifest, roughly a wheel. And Spring Boot is the closest thing to Django: an opiniona...

Types, Generics & Nullability

Post 1 changed how you think about Java values: everything is passed by value, == asks "same object?", .equals() asks "same value?", types are checked at compile time, and String is immutable. This post is about the type system itself — the machinery behind those rules. For a Python developer, Java's type system is the biggest daily difference you'll feel, and it will either read as bureaucracy or as a second pair of eyes. Which one depends on understanding what it's actually doing. The honest frame for this whole post: every code block below ran on JDK 21 on my machine, and every output block is the real output, pasted verbatim. Python comparisons ran on Python 3.12. Where I show a compile error, I show the real javac message. Nothing here is "trust me." 1. Two worlds: primitives vs wrapper classes In Python, every value is an object — 42 is a full int object, and Python integers have arbitrary precision. Java splits its world...