0

So my code literally working just fine, but I want to refactor my massive main file so it can be maintained. As you can see on my code, it's contain a bunch of expression on the switch statement and it looks a bit mess for me. How to refactor the switch statement ? Should I use interface or abstract class or something like that to simplify it ? Any insight would be helpful, TIA.

static void tampilMenu(ArrayList<Person> p) {
        boolean quit = false;
        do {
            System.out.println("==== Pilih Menu ====");
            System.out.println("1.Buat Objek Person!");
            System.out.println("2.Buat Akun Bank pada Objek Person!");
            System.out.println("3.Lihat daftar rekening dari objek Person!");
            System.out.println("4.Setor Uang ke Rekening dari objek Person");
            System.out.println("5.Tarik Uang dari Rekening objek Person");
            System.out.println("6.Transfer Uang!");
            System.out.println("7.Tampilkan daftar Objek Person!");
            System.out.println("=======================");

            Scanner in = new Scanner(System.in);
            System.out.println("Pilih Menu no : ");
            String menu = in.nextLine();

            switch (menu) {
                // buat objek person baru
                case "1" -> {
                    try {
                        String nama;
                        int umur;
                        do {
                            System.out.println("Nama objek Person : (tidak boleh blank) ");
                            nama = in.nextLine();
                            nama = nama.replaceAll("\\s", "");
                        } while (nama.equals(""));
                        System.out.println("Umur : ");
                        umur = in.nextInt();
                        p.add(new Person(nama, umur));
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan input!");
                    }
                }
                // buka akun bank dari objek person yang ada
                case "2" -> {
                    try {
                        // list objek person yang ada
                        for (int i = 0; i < p.size(); i++) {
                            System.out.println(String.format("%d. [nama: %s]", i + 1, p.get(i).getNama()));
                        }
                        System.out.println("Pilih [No.Urut] objek person yang akan dibuat akun bank ? contoh: 1");
                        int i = Integer.parseInt(in.nextLine());
                        System.out.println("Ketik Nama Bank : (contoh: BRI / BCA / BSI / BNI /...)");
                        String namaBank = in.nextLine();
                        System.out.println("Ketik Kode Bank 3 digit angka: (contoh: 002 / 003 / 005 / 006 /...)");
                        String kdBank = in.nextLine();
                        System.out.println("Masukkan jumlah setoran awal Rp. : (tanpa pemisah ribuan,contoh: 100000)");
                        Double setorAwal = in.nextDouble();
                        p.get(i - 1).bukaAkunBank(namaBank, kdBank, setorAwal);
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan input atau belum ada objek Person yang dibuat!");
                    }

                }
                // lihat daftar rekening dari objek person yang ada
                case "3" -> {
                    try {
                        // list objek person yang ada
                        for (int i = 0; i < p.size(); i++) {
                            System.out.println(String.format("%d. [nama: %s]", i + 1, p.get(i).getNama()));
                        }
                        System.out.println(
                                "Pilih [No.Urut] objek person yg ingin dilihat daftar rekeningnya ? contoh: 1");
                        int i = Integer.parseInt(in.nextLine());
                        // tampilkan list rekening bank dari objek person terpilih
                        p.get(i - 1).tampilListRekeningBank();
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan input atau belum ada objek Person yang dibuat!");
                    }
                }
                // setor uang ke salah satu rekening dari objek person
                case "4" -> {
                    try {
                        // list objek person yang ada
                        for (int i = 0; i < p.size(); i++) {
                            System.out.println(String.format("%d. [nama: %s]", i + 1, p.get(i).getNama()));
                        }
                        System.out.println("Pilih [No.Urut] objek person yg ingin setor ? contoh: 1 / 2");
                        int i = Integer.parseInt(in.nextLine());
                        // tampilkan daftar rekening dari objek terpilih
                        p.get(i - 1).tampilListRekeningBank();
                        System.out.println(
                                "Pilih Nomor Rekening objek person yg ingin disetor (9 digit)? contoh: 002393873");
                        String noRek = in.nextLine();
                        System.out.println("Masukkan jumlah uang (Rp.) yang ingin disetor ? contoh: 10000");
                        Double jumlahUang = in.nextDouble();
                        // Setorkan ke akunbank dari objek person terkait
                        BankAccount ba = p.get(i - 1).getAkunBank(noRek);
                        // setor dilakukan
                        ba.setor(jumlahUang);
                        // tampilkan saldo akhir dari rek. yang disetor
                        System.out.println(String.format("Saldo akhir objek %s no.rek %s Bank %s adalah %.2f",
                                p.get(i - 1).getNama(),
                                noRek,
                                p.get(i - 1).getAkunBank(noRek).getBank(),
                                p.get(i - 1).getAkunBank(noRek).getSaldo()));
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan Input atau No. Rekening Tidak Terdaftar!!");
                    }
                }
                // tarik uang dari salah satu rekening objek person
                case "5" -> {
                    try {
                        // list objek person yang ada
                        for (int i = 0; i < p.size(); i++) {
                            System.out.println(String.format("%d. [nama: %s]", i + 1, p.get(i).getNama()));
                        }
                        System.out.println(
                                "Pilih [No.Urut] objek person yg ingin melakukan penarikan uang ? contoh: 1 / 2");
                        int i = Integer.parseInt(in.nextLine());
                        // tampilkan daftar rekening dari objek terpilih
                        p.get(i - 1).tampilListRekeningBank();
                        System.out.println(
                                "Pilih Nomor Rekening objek person yg ingin ditarik (9 digit)? contoh: 002393873");
                        String noRek = in.nextLine();
                        System.out.println(
                                "Masukkan jumlah uang (Rp.) yang ingin ditarik (Pastikan saldo tersedia)? contoh: 10000");
                        Double jumlahUang = in.nextDouble();
                        if (p.get(i - 1).getAkunBank(noRek).getSaldo() < jumlahUang) {
                            System.out.println("Saldo tidak mencukupi!");
                        } else {

                            // Setorkan ke akunbank dari objek person terkait
                            BankAccount ba = p.get(i - 1).getAkunBank(noRek);
                            ba.tarikSaldo(jumlahUang);
                            System.out.println(String.format("Saldo akhir objek %s no.rek %s Bank %s adalah %.2f",
                                    p.get(i - 1).getNama(),
                                    noRek,
                                    p.get(i - 1).getAkunBank(noRek).getBank(),
                                    p.get(i - 1).getAkunBank(noRek).getSaldo()));
                        }
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan Input atau No. Rekening Tidak Terdaftar!!");
                    }
                }
                case "6" -> {
                    try {
                        // list objek person yang ada
                        for (int i = 0; i < p.size(); i++) {
                            System.out.println(String.format("%d. [nama: %s]", i + 1, p.get(i).getNama()));
                        }
                        System.out.println(
                                "Pilih [No.Urut] objek person yg ingin melakukan transfer/kirim uang ? contoh: 1 / 2");
                        int i = Integer.parseInt(in.nextLine());
                        // tampilkan daftar rekening dari objek terpilih
                        p.get(i - 1).tampilListRekeningBank();
                        System.out.println("Pilih Nomor Rekening Pengirim (9 digit)? contoh: 002393873");
                        String noRek = in.nextLine();
                        System.out.println(
                                "Masukkan jumlah uang (Rp.) yang ingin dikirim (Pastikan saldo tersedia)? contoh: 10000");
                        Double jumlahUang = Double.parseDouble(in.nextLine());
                        if (p.get(i - 1).getAkunBank(noRek).getSaldo() < jumlahUang) {
                            System.out.println("Saldo tidak mencukupi!");
                        } else {
                            // Dapatkan akun bank yang digunakan untuk mengirim/transfer
                            BankAccount ba = p.get(i - 1).getAkunBank(noRek);
                            // Pilih penerima Transfer dari list objek person yang ada
                            for (int x = 0; x < p.size(); x++) {
                                System.out.println(String.format("%d. [nama: %s]", x + 1, p.get(x).getNama()));
                            }
                            System.out.println("Pilih [No.Urut] objek person  penerima transfer uang ? contoh: 1 / 2");
                            int x = Integer.parseInt(in.nextLine());
                            // tampilkan daftar rekening Penerima transfer (objek Person)
                            p.get(x - 1).tampilListRekeningBank();
                            System.out.println("Pilih Nomor Rekening Penerima (9 digit)? contoh: 002393873");
                            String noRekPenerima = in.nextLine();
                            // transfer
                            ba.transfer(jumlahUang, p.get(x - 1), noRekPenerima);
                            // informasi saldo pengirim dan penerima
                            System.out
                                    .println(String.format(
                                            " (Pengirim) Saldo akhir objek %s no.rek %s Bank %s adalah %.2f",
                                            p.get(i - 1).getNama(),
                                            noRek,
                                            p.get(i - 1).getAkunBank(noRek).getBank(),
                                            p.get(i - 1).getAkunBank(noRek).getSaldo()));
                            System.out
                                    .println(String.format(
                                            " (Penerima) Saldo akhir objek %s no.rek %s Bank %s adalah %.2f",
                                            p.get(x - 1).getNama(),
                                            noRekPenerima,
                                            p.get(x - 1).getAkunBank(noRekPenerima).getBank(),
                                            p.get(x - 1).getAkunBank(noRekPenerima).getSaldo()));
                        }
                    } catch (Exception e) {
                        System.out.println("Terjadi kesalahan Input atau No. Rekening Tidak Terdaftar!!");
                    }
                }
                // tampilkan daftar objek Person yang ada
                case "7" -> {
                    for (int i = 0; i < p.size(); i++) {
                        System.out
                                .println(String.format("%d. [nama: %s] [umur: %d] [total saldo semua bank : Rp. %.2f]",
                                        i + 1,
                                        p.get(i).getNama(),
                                        p.get(i).getUmur(),
                                        p.get(i).rekapSaldoRekening()));

                    }
                }
                // program dihentikan/selesai
                default -> {
                    System.out.println("Inputan Tidak Terdaftar, Program dihentikan!");
                    quit = true;
                }
            }
        } while (!quit);

    public static void main(String[] args) {
        ArrayList<Person> p = new ArrayList();
        tampilMenu(p);
    }
Dio Brando
  • 73
  • 7
  • 8
    Well the obvious first solution would be to extract the contents of each `case` into separate methods. – QBrute Mar 02 '22 at 13:57
  • 1
    check this: https://stackoverflow.com/questions/31676586/java-switch-case-menu-scanner. Regards! – mathyas Mar 02 '22 at 13:59
  • 1
    A further refactoring would be to create a class to represent a menu option (with its title and "body"); then you could programmatically print the list, and then execute the right item, rather than having to remember to get the numbers to match up. – Andy Turner Mar 02 '22 at 14:05
  • Ah yes, so I decided to create class that contain method which represent all of my switch case statement and It works just fine, thanks – Dio Brando Mar 03 '22 at 01:06

0 Answers0