Proyek ini membangun aplikasi pencatat keuangan pribadi yang berjalan penuh di terminal: mencatat pemasukan dan pengeluaran harian, mengelompokkannya ke kategori beranggaran, menyusun laporan bulanan lengkap dengan tren, lalu menyimpan seluruh data ke berkas teks yang integritasnya diperiksa saat dibuka kembali. Seluruh kode ditulis dengan JDK 25 murni — tanpa framework dan tanpa pustaka luar — sehingga setiap keputusan desain, dari pemilihan BigDecimal hingga kebijakan penolakan berkas cacat, dapat dibaca dan dibedah langsung.

Keuangan pribadi adalah bahan latihan yang menuntut tiga disiplin sekaligus. Pertama, pemodelan data murni: transaksi, kategori, dan laporan dibentuk dari record dan enum yang menjaga invariannya sendiri lewat validasi constructor. Kedua, pengolahan kumpulan data: seluruh laporan dirakit dengan Stream API — groupingBy, partitioningBy, teeing, dan reducing — alih-alih loop bertumpuk. Ketiga, disiplin validasi: nominal selalu BigDecimal, tanggal contoh dibekukan agar keluaran deterministik, dan berkas eksternal diperiksa dua lapis, field demi field ditambah checksum.

Sebelum mulai, pastikan materi berikut sudah dikuasai karena proyek ini memakainya tanpa mengulang teorinya: variabel-dan-tipe-data untuk BigDecimal dan format angka, collections-framework untuk List serta Map, stream-api untuk beragam collector, date-time-api untuk LocalDate dan YearMonth, serta exception-handling untuk perbedaan exception bertipe checked dan unchecked. Kebutuhan perangkat lunaknya cukup JDK 25; tidak ada dependensi lain yang harus dipasang.

Cara mengikuti proyek ini: kerjakan empat bagian secara berurutan karena satu aplikasi yang sama berevolusi dari bagian ke bagian — model transaksi pada Bagian 1 tumbuh menjadi kategori beranggaran pada Bagian 2, laporan berbasis Stream pada Bagian 3, dan persistensi berkas tervalidasi pada Bagian 4. Setiap bagian memuat versi terkini lengkap dari seluruh class yang dibutuhkan, jadi salin seluruh berkas .java satu bagian ke satu folder kosong, lalu jalankan java DemoKeuangan.java — JDK mengompilasi berkas yang saling merujuk secara otomatis.