Melaksanakan Mesin Negeri Mudah dengan Jumlah Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat Mesin Negeri dan bagaimana ia dapat dilaksanakan di Java menggunakan Enums.

Kami juga akan menerangkan kelebihan pelaksanaan ini berbanding menggunakan antara muka dan kelas konkrit untuk setiap negeri.

2. Jumlah Java

Java Enum adalah jenis kelas khas yang menentukan senarai pemalar. Ini membolehkan pelaksanaan selamat jenis dan kod yang lebih mudah dibaca .

Sebagai contoh, anggaplah kita memiliki sistem perisian HR yang dapat menyetujui permintaan cuti yang dikemukakan oleh pekerja. Permintaan ini disemak oleh Ketua Pasukan, yang menyerahkannya kepada Pengurus Jabatan. Pengurus Jabatan adalah orang yang bertanggungjawab meluluskan permintaan tersebut.

Enum termudah yang memenuhi syarat permintaan cuti adalah:

public enum LeaveRequestState { Submitted, Escalated, Approved }

Kita boleh merujuk kepada pemalar enum ini:

LeaveRequestState state = LeaveRequestState.Submitted;

Enum juga boleh mengandungi kaedah. Kita boleh menulis kaedah abstrak dalam enum, yang akan memaksa setiap contoh enum untuk melaksanakan kaedah ini. Ini sangat penting untuk pelaksanaan mesin negara, seperti yang akan kita lihat di bawah.

Oleh kerana Java secara implisit memperluas kelas java.lang.Enum , mereka tidak dapat melanjutkan kelas yang lain. Namun, mereka dapat melaksanakan antara muka, seperti kelas lain.

Berikut adalah contoh enum yang mengandungi kaedah 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 pada akhir pemalar enum terakhir. Tanda titik koma diperlukan apabila kita mempunyai satu atau lebih kaedah mengikut pemalar.

Dalam kes ini, kami meluaskan contoh pertama dengan kaedah ResponserPerson () . Ini memberitahu kita orang yang bertanggungjawab melakukan setiap tindakan. Oleh itu, jika kita berusaha untuk memeriksa orang yang bertanggungjawab untuk keadaan Escalated , ini akan memberi kita "Ketua Pasukan":

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

Dengan cara yang sama, jika kita memeriksa siapa yang bertanggung jawab untuk menyetujui permintaan tersebut, itu akan memberi kita "Pengurus Jabatan":

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

3. Mesin Negeri

Mesin keadaan - juga dipanggil mesin keadaan terbatas atau automaton terhingga - adalah model komputasi yang digunakan untuk membina mesin abstrak. Mesin ini hanya boleh berada dalam satu keadaan pada waktu tertentu. Setiap keadaan adalah status sistem yang berubah ke keadaan lain. Perubahan keadaan ini disebut peralihan.

Ini boleh menjadi rumit dalam matematik dengan gambar rajah dan notasi, tetapi perkara lebih mudah bagi kami pengaturcara.

Pola Negeri adalah salah satu daripada dua puluh tiga corak reka bentuk GoF yang terkenal. Pola ini meminjam konsep dari model dalam matematik. Ia membolehkan objek merangkumi tingkah laku yang berbeza untuk objek yang sama, berdasarkan keadaannya. Kami dapat memprogram peralihan antara negeri dan kemudian menentukan keadaan yang berasingan.

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

4. Jumlah sebagai Mesin Negeri

Kami akan memfokuskan pada pelaksanaan enum mesin negara di Jawa. Pelaksanaan lain mungkin dilakukan, dan kami akan membandingkannya di bahagian seterusnya.

Titik utama pelaksanaan mesin negara menggunakan enum adalah bahawa kita tidak perlu berurusan dengan menetapkan keadaan secara eksplisit . Sebagai gantinya, kami hanya dapat memberikan logik mengenai bagaimana beralih dari satu keadaan ke keadaan yang lain. Mari selami terus:

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, peralihan mesin keadaan dilaksanakan menggunakan kaedah abstrak enum . Lebih tepat lagi, menggunakan nextState () pada setiap pemalar enum, kami menentukan peralihan ke keadaan seterusnya. Sekiranya diperlukan, kita juga dapat menerapkan kaedahState sebelumnya () .

Berikut adalah ujian untuk memeriksa pelaksanaan 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 memulakan permintaan cuti dalam keadaan awal yang Dihantar . Kami kemudian mengesahkan peralihan keadaan dengan menggunakan kaedah NextState () yang kami laksanakan di atas.

Perhatikan bahawa kerana Diluluskan adalah keadaan terakhir, tidak ada peralihan lain yang dapat terjadi .

5. Kelebihan Melaksanakan Mesin Negara Dengan Jumlah Java

Pelaksanaan mesin negara dengan antara muka dan kelas pelaksanaan dapat menjadi sejumlah besar kod untuk dikembangkan dan dipelihara.

Oleh kerana enum Java, dalam bentuk termudah, daftar pemalar, kita dapat menggunakan enum untuk menentukan keadaan kita. Dan kerana enum juga dapat berisi tingkah laku, kita dapat menggunakan kaedah untuk menyediakan peralihan pelaksanaan antara negara.

Memiliki semua logik dalam enum sederhana membolehkan penyelesaian yang bersih dan mudah.

6. Kesimpulannya

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

Akhirnya, kami juga membincangkan kelebihan menggunakan enum untuk melaksanakan mesin keadaan. Sebagai alternatif kepada penyelesaian antara muka dan pelaksanaan, enum menyediakan pelaksanaan mesin negara yang lebih bersih dan mudah difahami.

Seperti biasa, semua coretan kod yang disebutkan dalam artikel ini terdapat di repositori GitHub kami.