Mentransmisikan int ke Enum di Jawa

1. Ikhtisar

Dalam tutorial ini, kita akan melihat secara singkat berbagai cara mentransmisikan int ke nilai enum di Java. Meskipun tidak ada cara casting langsung, ada beberapa cara untuk memperkirakannya.

2. Menggunakan nilai Enum #

Pertama, lihat mari kita bagaimana kita bisa memecahkan masalah ini dengan menggunakan Enum 's nilai metode.

Mari kita mulai dengan membuat PizzaStatus enum yang menentukan status pesanan pizza:

public enum PizzaStatus { ORDERED(5), READY(2), DELIVERED(0); private int timeToDelivery; PizzaStatus (int timeToDelivery) { this.timeToDelivery = timeToDelivery; } // Method that gets the timeToDelivery variable. }

Kami mengaitkan setiap nilai enum konstan dengan bidang timeToDelivery . Saat menentukan enum konstan, kami meneruskan bidang timeToDelivery ke konstruktor.

The static nilai metode mengembalikan sebuah array yang berisi semua nilai-nilai enum di urutan deklarasi mereka. Oleh karena itu, kita dapat menggunakan nilai integer timeToDelivery untuk mendapatkan nilai enum yang sesuai:

int timeToDeliveryForOrderedPizzaStatus = 5; PizzaStatus pizzaOrderedStatus = null; for (PizzaStatus pizzaStatus : PizzaStatus.values()) { if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) { pizzaOrderedStatus = pizzaStatus; } } assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

Di sini, kami menggunakan larik yang dikembalikan oleh PizzaStatus.values ​​() untuk menemukan nilai yang cocok berdasarkan properti timeToDelivery .

Pendekatan ini, bagaimanapun, cukup bertele-tele. Selain itu, ini juga tidak efisien karena setiap kali kita ingin mengambil PizzaStatus yang sesuai , kita perlu mengulang PizzaStatus.values ​​() .

2.1. Menggunakan Java 8 Stream

Mari kita lihat bagaimana kita dapat menemukan PizzaStatus yang cocok menggunakan pendekatan Java 8:

int timeToDeliveryForOrderedPizzaStatus = 5; Optional pizzaStatus = Arrays.stream(PizzaStatus.values()) .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) .findFirst(); assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

Kode ini terlihat lebih ringkas daripada yang menggunakan for loop. Namun, tetap saja, kami mengulangi PizzaStatus.values ​​() setiap kali kami perlu mendapatkan enum yang cocok.

Juga, perhatikan bahwa dalam pendekatan ini kita mendapatkan Opsional daripada contoh PizzaStatus secara langsung .

3. Menggunakan Peta

Selanjutnya, mari gunakan struktur data Peta Java bersama dengan metode nilai untuk mengambil nilai enum yang sesuai dengan waktu untuk mengirimkan nilai integer.

Dalam pendekatan ini, metode nilai dipanggil hanya sekali saat menginisialisasi peta . Selain itu, karena kita menggunakan peta, kita tidak perlu mengulang nilai setiap kali kita perlu mengambil nilai enum yang sesuai dengan waktu pengiriman.

Kami menggunakan timeToDeliveryToEnumValuesMapping peta statis secara internal, yang menangani pemetaan waktu untuk mengirimkan ke nilai enum yang sesuai.

Selanjutnya, metode nilai dari kelas Enum menyediakan semua nilai enum. Di blok statis , kami melakukan iterasi pada array nilai enum dan menambahkannya ke peta bersama dengan waktu yang sesuai untuk mengirimkan nilai integer sebagai kunci:

private static Map timeToDeliveryToEnumValuesMapping = new HashMap(); static { for (PizzaStatus pizzaStatus : PizzaStatus.values()) { timeToDeliveryToEnumValuesMapping.put( pizzaStatus.getTimeToDelivery(), pizzaStatus ); } }

Terakhir, kami membuat metode statis yang menggunakan integer timeToDelivery sebagai parameter. Metode ini mengembalikan nilai enum yang sesuai menggunakan timeToDeliveryToEnumValuesMapping peta statis :

public static PizzaStatus castIntToEnum(int timeToDelivery) { return timeToDeliveryToEnumValuesMapping.get(timeToDelivery); }

Dengan menggunakan peta statis dan metode statis, kami mengambil nilai enum yang sesuai dengan waktu untuk mengirimkan nilai integer.

4. Kesimpulan

Sebagai kesimpulan, kami melihat beberapa solusi untuk mengambil nilai enum yang sesuai dengan nilai integer.

Seperti biasa, semua contoh kode ini tersedia di GitHub.