Proyek pertama ini mengubah materi-materi sebelumnya menjadi satu program yang benar-benar dipakai orang: aplikasi catatan tugas yang berjalan sepenuhnya di terminal. Bagian 1 membangun kerangkannya — rancangan class, menu utama, dan pembacaan input pengguna. Pada akhir bagian ini aplikasi sudah bisa dijalankan: menambah tugas, menampilkan daftar, dan keluar dengan rapi, meskipun data masih hidup di memori dan masukan salah belum ditolak.
Rancangan Awal Aplikasi #
Kita membagi tanggung jawab sejak awal menjadi class-class kecil, lalu menumbuhkannya bagian demi bagian:
| Class | Tanggung jawab | Muncul di |
|---|---|---|
Tugas | menyimpan data satu tugas (id, judul, status selesai) | Bagian 1 |
AplikasiTugas | menu utama, loop program, dan interaksi dengan pengguna | Bagian 1 |
DaftarTugas | mengelola kumpulan tugas beserta aturan validasinya | Bagian 2 |
PenyimpananTugas | menyimpan dan memuat daftar dari berkas | Bagian 3 |
UjiDaftarTugas | menguji perilaku inti sebelum dikemas menjadi JAR | Bagian 4 |
Alur programnya sebuah loop: tampilkan menu, baca satu pilihan, jalankan aksi yang sesuai, lalu kembali ke menu sampai pengguna memilih keluar.
Class Tugas Menyimpan Satu Baris Data #
Class Tugas adalah model data: satu baris daftar tugas. Class ini tidak membaca input, tidak mencetak apa pun, dan tidak tahu bahwa aplikasi punya menu — tanggung jawab tersebut kita serahkan ke class lain.
/**
* Satu baris tugas pada aplikasi catatan tugas.
* Class ini hanya menyimpan data; tidak membaca input dan tidak mencetak apa pun.
*/
public class Tugas {
private final int id;
private final String judul;
private boolean selesai;
/** Membuat tugas baru yang belum selesai. */
public Tugas(int id, String judul) {
this.id = id;
this.judul = judul;
this.selesai = false;
}
public int id() {
return id;
}
public String judul() {
return judul;
}
public boolean selesai() {
return selesai;
}
public void tandaiSelesai() {
this.selesai = true;
}
/** Bentuk baris siap tampil, misalnya "[ ] 1. Belajar Java dasar". */
public String formatBaris() {
String penanda = selesai ? "[x]" : "[ ]";
return penanda + " " + id + ". " + judul;
}
}Mari kita bedah bagian-bagian pentingnya:
- Baris
private final int id;danprivate final String judul;: id dan judul tidak pernah berubah setelah tugas dibuat — kata kuncifinalmenjamin kompiler menolak penugasan ulang. Hanya statusselesaiyang boleh berubah. - Constructor
public Tugas(int id, String judul): satu-satunya jalan membuat tugas; constructor sekaligus menetapkanselesai = falsesehingga setiap tugas baru selalu dimulai belum selesai. - Method
id(),judul(), danselesai(): pengakses (accessor) gaya record — nama method sama dengan field tanpa awalanget. Class di luarTugasmembaca data lewat method ini, bukan lewat field publik. - Method
tandaiSelesai(): mengubah status satu arah — sekali selesai, versi aplikasi ini tidak menyediakan cara membatalkan.
Menu Utama dan Loop Program #
Sekarang kita rakit kerangka interaktifnya. AplikasiTugas adalah titik masuk program: method main memegang state (daftar tugas, sumber masukan, penanda loop) dan dua method bantu menangani tampilan. Sesi berikut memberi masukan 1, judul Belajar Java dasar, pilihan 7 yang tidak dikenal, 2, lalu 0:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Titik masuk aplikasi catatan tugas versi awal:
* menu utama, pembacaan input, dan penyimpanan sementara di memori.
*/
public class AplikasiTugas {
public static void main(String[] args) {
List<Tugas> daftar = new ArrayList<>();
Scanner masukan = new Scanner(System.in);
boolean berjalan = true;
System.out.println("=== Aplikasi Catatan Tugas ===");
while (berjalan) {
tampilkanMenu();
String pilihan = masukan.nextLine().strip();
switch (pilihan) {
case "1" -> {
System.out.print("Judul tugas: ");
String judul = masukan.nextLine();
daftar.add(new Tugas(daftar.size() + 1, judul));
System.out.println("Tugas ditambahkan.");
}
case "2" -> tampilkanDaftar(daftar);
case "0" -> {
berjalan = false;
System.out.println("Sampai jumpa!");
}
default -> System.out.println("Pilihan tidak dikenal: " + pilihan);
}
}
}
private static void tampilkanMenu() {
System.out.println();
System.out.println("Menu:");
System.out.println("1. Tambah tugas");
System.out.println("2. Lihat daftar tugas");
System.out.println("0. Keluar");
System.out.print("Pilihan: ");
}
private static void tampilkanDaftar(List<Tugas> daftar) {
System.out.println();
if (daftar.isEmpty()) {
System.out.println("Belum ada tugas.");
return;
}
System.out.println("Daftar tugas:");
for (Tugas tugas : daftar) {
System.out.println(tugas.formatBaris());
}
}
}Output yang Dihasilkan:
=== Aplikasi Catatan Tugas ===
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan: Judul tugas: Tugas ditambahkan.
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan: Pilihan tidak dikenal: 7
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan:
Daftar tugas:
[ ] 1. Belajar Java dasar
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan: Sampai jumpa!Mari kita telaah baris-per-baris bagian intinya:
- Baris
List<Tugas> daftar = new ArrayList<>();: seluruh tugas hidup di satuArrayListyang dipegang methodmain. - Baris
Scanner masukan = new Scanner(System.in);: satuScanneruntuk seluruh program — membuatScannerbaru di dalam loop berisiko kehilangan data yang sudah dibaca. - Baris
String pilihan = masukan.nextLine().strip();: pilihan dibaca sebagai satu baris penuh, lalustrip()membuang spasi di kiri-kanan sehingga" 1 "tetap diterima. Karena pilihan berupa teks, ketikan7tidak menghentikan program — cabangdefaultcukup menolak dengan pesan. - Baris
daftar.add(new Tugas(daftar.size() + 1, judul));: id tugas baru dihitung dari ukuran daftar; daftar kosong menghasilkan id1, tugas berikutnya id2, dan seterusnya. - Blok
case "0" -> { berjalan = false; ... }: keluar dari loop dengan mengubah penandaberjalan— loop berakhir terkendali setelah iterasi terakhir selesai. - Method
tampilkanDaftar(daftar): mencetakBelum ada tugas.saat daftar kosong; jika tidak, setiap elemen dicetak lewattugas.formatBaris()sehinggaAplikasiTugastidak perlu tahu cara satu tugas diformat.
Menjalankan Program dari Beberapa Berkas Sumber #
Proyek ini terdiri atas dua berkas, dan peluncur kode sumber JDK menangani keduanya dalam satu perintah: java AplikasiTugas.java menemukan referensi ke class Tugas, lalu mengompilasi Tugas.java di direktori yang sama secara otomatis. Sesi berikut dikutip dari eksekusi sungguhan dengan JDK 25:
$ ls
AplikasiTugas.java Tugas.java
$ printf '1\nMenulis dokumentasi proyek\n0\n' | java AplikasiTugas.java
=== Aplikasi Catatan Tugas ===
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan: Judul tugas: Tugas ditambahkan.
Menu:
1. Tambah tugas
2. Lihat daftar tugas
0. Keluar
Pilihan: Sampai jumpa!Cara klasik dua langkah tetap tersedia: javac AplikasiTugas.java Tugas.java lalu java AplikasiTugas. Bagian 4 memakai jalur tersebut saat merakit JAR.
Kerangka aplikasi kini berdiri: data tersimpan di class Tugas, menu dan input dijalankan AplikasiTugas. Celah yang tersisa — masukan kosong, id yang bukan angka, id yang tidak ada — kita tutup di Bagian 2 dengan validasi terpusat dan exception buatan sendiri.
Referensi #
- Oracle: Scanner — Java SE 25 API
- OpenJDK: JEP 458 — Launch Multi-File Source-Code Programs
- Oracle: Learn Java
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
AplikasiTugas.java
Unduh berkasimport java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Titik masuk aplikasi catatan tugas versi awal:
* menu utama, pembacaan input, dan penyimpanan sementara di memori.
*/
public class AplikasiTugas {
public static void main(String[] args) {
List<Tugas> daftar = new ArrayList<>();
Scanner masukan = new Scanner(System.in);
boolean berjalan = true;
System.out.println("=== Aplikasi Catatan Tugas ===");
while (berjalan) {
tampilkanMenu();
String pilihan = masukan.nextLine().strip();
switch (pilihan) {
case "1" -> {
System.out.print("Judul tugas: ");
String judul = masukan.nextLine();
daftar.add(new Tugas(daftar.size() + 1, judul));
System.out.println("Tugas ditambahkan.");
}
case "2" -> tampilkanDaftar(daftar);
case "0" -> {
berjalan = false;
System.out.println("Sampai jumpa!");
}
default -> System.out.println("Pilihan tidak dikenal: " + pilihan);
}
}
}
private static void tampilkanMenu() {
System.out.println();
System.out.println("Menu:");
System.out.println("1. Tambah tugas");
System.out.println("2. Lihat daftar tugas");
System.out.println("0. Keluar");
System.out.print("Pilihan: ");
}
private static void tampilkanDaftar(List<Tugas> daftar) {
System.out.println();
if (daftar.isEmpty()) {
System.out.println("Belum ada tugas.");
return;
}
System.out.println("Daftar tugas:");
for (Tugas tugas : daftar) {
System.out.println(tugas.formatBaris());
}
}
}
Tugas.java
Unduh berkas/**
* Satu baris tugas pada aplikasi catatan tugas.
* Class ini hanya menyimpan data; tidak membaca input dan tidak mencetak apa pun.
*/
public class Tugas {
private final int id;
private final String judul;
private boolean selesai;
/** Membuat tugas baru yang belum selesai. */
public Tugas(int id, String judul) {
this.id = id;
this.judul = judul;
this.selesai = false;
}
public int id() {
return id;
}
public String judul() {
return judul;
}
public boolean selesai() {
return selesai;
}
public void tandaiSelesai() {
this.selesai = true;
}
/** Bentuk baris siap tampil, misalnya "[ ] 1. Belajar Java dasar". */
public String formatBaris() {
String penanda = selesai ? "[x]" : "[ ]";
return penanda + " " + id + ". " + judul;
}
}