public class SiklusServlet {

    static class LayarTamuRawan {
        // simulasi servlet: SATU instance melayani BANYAK permintaan
        private int jumlahPanggilan = 0;
        private String penggunaTerakhir = "(belum ada)";

        void init() {
            System.out.println("[init]     dipanggil sekali, servlet siap melayani");
        }

        String service(String pengguna) {
            jumlahPanggilan++;
            System.out.println("[service]  halo " + pengguna
                    + " (permintaan ke-" + jumlahPanggilan + ")");
            penggunaTerakhir = pengguna;
            return penggunaTerakhir;
        }

        void destroy() {
            System.out.println("[destroy]  dipanggil sekali saat wadah berhenti, total permintaan = "
                    + jumlahPanggilan);
        }
    }

    static class LayarTamuAman {
        private int jumlahPanggilan = 0;

        void init() {
            System.out.println("[init]     dipanggil sekali, servlet siap melayani");
        }

        String service(String pengguna) {
            jumlahPanggilan++;
            String sapaan = "halo " + pengguna; // state per permintaan = variabel lokal
            System.out.println("[service]  " + sapaan
                    + " (permintaan ke-" + jumlahPanggilan + ")");
            return sapaan;
        }

        void destroy() {
            System.out.println("[destroy]  dipanggil sekali saat wadah berhenti, total permintaan = "
                    + jumlahPanggilan);
        }
    }

    public static void main(String[] args) {
        System.out.println("== Versi rawan: state pernah menempel di instance ==");
        LayarTamuRawan rawan = new LayarTamuRawan();
        rawan.init();
        rawan.service("Budi");
        rawan.service("Siti");
        rawan.service("Dewi");
        System.out.println("[kondisi]  variabel instance penggunaTerakhir = "
                + rawan.penggunaTerakhir + " (milik permintaan sebelumnya!)");
        rawan.destroy();

        System.out.println();
        System.out.println("== Versi aman: state hidup di variabel lokal ==");
        LayarTamuAman aman = new LayarTamuAman();
        aman.init();
        aman.service("Budi");
        aman.service("Siti");
        aman.service("Dewi");
        aman.destroy();
    }
}
