Menerapkan Mesin Negara Sederhana dengan Java Enums

1. Ikhtisar

Dalam tutorial ini, kita akan melihat State Machines dan bagaimana mereka dapat diimplementasikan di Java menggunakan Enums.

Kami juga akan menjelaskan keuntungan implementasi ini dibandingkan menggunakan antarmuka dan kelas konkret untuk setiap status.

2. Java Enums

Java Enum adalah tipe kelas khusus yang mendefinisikan daftar konstanta. Hal ini memungkinkan penerapan yang aman bagi tipe dan kode yang lebih mudah dibaca .

Sebagai contoh, misalkan kita memiliki sistem perangkat lunak SDM yang dapat menyetujui permintaan cuti yang diajukan oleh karyawan. Permintaan ini ditinjau oleh Ketua Tim, yang meneruskannya ke Manajer Departemen. Manajer Departemen adalah orang yang bertanggung jawab untuk menyetujui permintaan tersebut.

Enum paling sederhana yang menyimpan status permintaan cuti adalah:

public enum LeaveRequestState { Submitted, Escalated, Approved }

Kita bisa merujuk ke konstanta enum ini:

LeaveRequestState state = LeaveRequestState.Submitted;

Enum juga bisa berisi metode. Kita bisa menulis metode abstrak dalam enum, yang akan memaksa setiap instance enum untuk mengimplementasikan metode ini. Ini sangat penting untuk implementasi mesin status, seperti yang akan kita lihat di bawah.

Karena enum Java secara implisit memperluas kelas java.lang.Enum , mereka tidak dapat memperluas kelas lain. Namun, mereka dapat mengimplementasikan antarmuka, sama seperti kelas lainnya.

Berikut adalah contoh enum yang berisi metode abstrak:

public enum LeaveRequestState { Submitted { @Override public String responsiblePerson() { return "Employee"; } }, Escalated { @Override public String responsiblePerson() { return "Team Leader"; } }, Approved { @Override public String responsiblePerson() { return "Department Manager"; } }; public abstract String responsiblePerson(); }

Perhatikan penggunaan titik koma di akhir konstanta enum terakhir. Titik koma diperlukan ketika kita memiliki satu atau lebih metode yang mengikuti konstanta.

Dalam kasus ini, kami memperluas contoh pertama dengan metode responsibilityPerson () . Ini memberi tahu kita orang yang bertanggung jawab untuk melakukan setiap tindakan. Jadi, jika kita mencoba untuk memeriksa orang yang bertanggung jawab atas status Dieskalasi , itu akan memberi kita "Ketua Tim":

LeaveRequestState state = LeaveRequestState.Escalated; assertEquals("Team Leader", state.responsiblePerson());

Dengan cara yang sama, jika kita memeriksa siapa yang bertanggung jawab untuk menyetujui permintaan, itu akan memberi kita "Manajer Departemen":

LeaveRequestState state = LeaveRequestState.Approved; assertEquals("Department Manager", state.responsiblePerson());

3. Mesin Negara

Mesin keadaan - juga disebut mesin keadaan terbatas atau robot terbatas - adalah model komputasi yang digunakan untuk membangun mesin abstrak. Mesin ini hanya dapat berada dalam satu keadaan pada waktu tertentu. Setiap keadaan adalah status dari sistem yang berubah ke keadaan lain. Perubahan keadaan ini disebut transisi.

Ini bisa menjadi rumit dalam matematika dengan diagram dan notasi, tetapi segalanya jauh lebih mudah bagi kami, programmer.

The State Pattern adalah salah satu dari dua puluh tiga pola desain GoF yang terkenal. Pola ini meminjam konsep dari model dalam matematika. Ini memungkinkan objek untuk merangkum perilaku berbeda untuk objek yang sama, berdasarkan statusnya. Kita dapat memprogram transisi antar negara bagian dan kemudian menentukan status terpisah.

Untuk menjelaskan konsep dengan lebih baik, kami akan memperluas contoh permintaan cuti kami untuk mengimplementasikan mesin status.

4. Enums sebagai Mesin Negara

Kami akan fokus pada implementasi enum mesin negara di Jawa. Penerapan lain dimungkinkan, dan kami akan membandingkannya di bagian selanjutnya.

Poin utama dari implementasi mesin status menggunakan enum adalah kita tidak harus berurusan dengan pengaturan status secara eksplisit . Sebagai gantinya, kami hanya dapat memberikan logika tentang cara beralih dari satu keadaan ke keadaan berikutnya. Mari selami lebih dalam:

public enum LeaveRequestState { Submitted { @Override public LeaveRequestState nextState() { return Escalated; } @Override public String responsiblePerson() { return "Employee"; } }, Escalated { @Override public LeaveRequestState nextState() { return Approved; } @Override public String responsiblePerson() { return "Team Leader"; } }, Approved { @Override public LeaveRequestState nextState() { return this; } @Override public String responsiblePerson() { return "Department Manager"; } }; public abstract LeaveRequestState nextState(); public abstract String responsiblePerson(); }

Dalam contoh ini, transisi mesin status diimplementasikan menggunakan metode abstrak enum . Lebih tepatnya, menggunakan nextState () pada setiap konstanta enum, kita menentukan transisi ke status berikutnya. Jika perlu, kita juga bisa mengimplementasikan metode PreviousState () .

Di bawah ini adalah tes untuk memeriksa implementasi kami:

LeaveRequestState state = LeaveRequestState.Submitted; state = state.nextState(); assertEquals(LeaveRequestState.Escalated, state); state = state.nextState(); assertEquals(LeaveRequestState.Approved, state); state = state.nextState(); assertEquals(LeaveRequestState.Approved, state);

Kami memulai permintaan cuti dalam keadaan awal Dikirim . Kami kemudian memverifikasi transisi status dengan menggunakan metode nextState () yang kami terapkan di atas.

Perhatikan bahwa karena Disetujui adalah keadaan akhir, tidak ada transisi lain yang dapat terjadi .

5. Keuntungan Mengimplementasikan Mesin Negara Dengan Java Enums

Implementasi mesin negara dengan antarmuka dan kelas implementasi dapat menjadi sejumlah besar kode untuk dikembangkan dan dipelihara.

Karena enum Java, dalam bentuknya yang paling sederhana, adalah daftar konstanta, kita dapat menggunakan enum untuk menentukan status kita. Dan karena enum juga dapat berisi perilaku, kita dapat menggunakan metode untuk menyediakan implementasi transisi antar status.

Memiliki semua logika dalam enum sederhana memungkinkan solusi yang bersih dan mudah.

6. Kesimpulan

Pada artikel ini, kami melihat mesin negara dan bagaimana mereka dapat diimplementasikan di Java menggunakan Enums. Kami memberi contoh dan mengujinya.

Akhirnya, kami juga membahas keuntungan menggunakan enum untuk mengimplementasikan mesin negara. Sebagai alternatif dari antarmuka dan solusi implementasi, enum menyediakan implementasi mesin negara yang lebih bersih dan lebih mudah dipahami.

Seperti biasa, semua cuplikan kode yang disebutkan dalam artikel ini dapat ditemukan di repositori GitHub kami.