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:

ClassTanggung jawabMuncul di
Tugasmenyimpan data satu tugas (id, judul, status selesai)Bagian 1
AplikasiTugasmenu utama, loop program, dan interaksi dengan penggunaBagian 1
DaftarTugasmengelola kumpulan tugas beserta aturan validasinyaBagian 2
PenyimpananTugasmenyimpan dan memuat daftar dari berkasBagian 3
UjiDaftarTugasmenguji perilaku inti sebelum dikemas menjadi JARBagian 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.

java Tugas.java
/**
 * 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:

  1. Baris private final int id; dan private final String judul;: id dan judul tidak pernah berubah setelah tugas dibuat — kata kunci final menjamin kompiler menolak penugasan ulang. Hanya status selesai yang boleh berubah.
  2. Constructor public Tugas(int id, String judul): satu-satunya jalan membuat tugas; constructor sekaligus menetapkan selesai = false sehingga setiap tugas baru selalu dimulai belum selesai.
  3. Method id(), judul(), dan selesai(): pengakses (accessor) gaya record — nama method sama dengan field tanpa awalan get. Class di luar Tugas membaca data lewat method ini, bukan lewat field publik.
  4. Method tandaiSelesai(): mengubah status satu arah — sekali selesai, versi aplikasi ini tidak menyediakan cara membatalkan.

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:

text
=== 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:

  1. Baris List<Tugas> daftar = new ArrayList<>();: seluruh tugas hidup di satu ArrayList yang dipegang method main.
  2. Baris Scanner masukan = new Scanner(System.in);: satu Scanner untuk seluruh program — membuat Scanner baru di dalam loop berisiko kehilangan data yang sudah dibaca.
  3. Baris String pilihan = masukan.nextLine().strip();: pilihan dibaca sebagai satu baris penuh, lalu strip() membuang spasi di kiri-kanan sehingga " 1 " tetap diterima. Karena pilihan berupa teks, ketikan 7 tidak menghentikan program — cabang default cukup menolak dengan pesan.
  4. Baris daftar.add(new Tugas(daftar.size() + 1, judul));: id tugas baru dihitung dari ukuran daftar; daftar kosong menghasilkan id 1, tugas berikutnya id 2, dan seterusnya.
  5. Blok case "0" -> { berjalan = false; ... }: keluar dari loop dengan mengubah penanda berjalan — loop berakhir terkendali setelah iterasi terakhir selesai.
  6. Method tampilkanDaftar(daftar): mencetak Belum ada tugas. saat daftar kosong; jika tidak, setiap elemen dicetak lewat tugas.formatBaris() sehingga AplikasiTugas tidak 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:

text
$ 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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

AplikasiTugas.java

Unduh berkas
java
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());
        }
    }
}

Tugas.java

Unduh berkas
java
/**
 * 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;
    }
}