Menghantar int ke Enum di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat secara ringkas cara yang berbeza untuk memberikan nilai int ke enum di Java. Walaupun tidak ada kaedah lakonan langsung, ada beberapa cara untuk menghampirinya.

2. Menggunakan nilai Enum #

Pertama, melihat let untuk bagaimana kita boleh menyelesaikan masalah ini dengan menggunakan Enum 's nilai kaedah.

Mari mulakan dengan membuat enjin PizzaStatus yang menentukan status pesanan untuk 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 malar dengan medan timeToDelivery . Semasa menentukan jumlah tetap, kami meneruskan medan timeToDelivery kepada pembina.

Yang statik nilai kaedah mengembalikan pelbagai yang mengandungi semua nilai-nilai enum dalam perintah perisytiharan mereka. Oleh 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 susunan yang dikembalikan oleh PizzaStatus.values ​​() untuk mencari nilai yang sesuai berdasarkan pada properti timeToDelivery .

Pendekatan ini, bagaimanapun, cukup verbose. Lebih-lebih lagi, ia juga tidak cekap kerana setiap kali kita ingin mengambil PizzaStatus yang sesuai , kita perlu melakukan iterasi atas nilai PizzaStatus. () .

2.1. Menggunakan Java 8 Stream

Mari lihat bagaimana kita dapat mencari PizzaStatus yang sesuai dengan pendekatan Java 8:

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

Kod ini kelihatan lebih ringkas daripada yang menggunakan loop for . Namun, tetap saja, kami melakukan iterasi pada nilai PizzaStatus. () setiap kali kita memerlukan enum yang sepadan.

Juga, perhatikan bahawa dalam pendekatan ini kita mendapatkan Opsyen dan bukannya contoh PizzaStatus secara langsung .

3. Menggunakan Peta

Seterusnya, mari kita gunakan struktur data Peta Java bersama dengan metode nilai untuk mengambil nilai enum yang sesuai dengan waktu untuk memberikan nilai bilangan bulat.

Dalam pendekatan ini, kaedah nilai dipanggil hanya sekali semasa memulakan peta . Lebih jauh lagi, kerana kita menggunakan peta, kita tidak perlu mengulang nilai setiap kali kita perlu mengambil nilai enum yang sesuai dengan waktu untuk menyampaikan.

Kami menggunakan peta masa statikToDeliveryToEnumValuesMapping secara dalaman, yang menangani pemetaan masa untuk dihantar ke nilai enum yang sesuai.

Tambahan pula, kaedah nilai kelas Enum memberikan semua nilai enum. Di blok statik , kami melakukan iterasi pada susunan nilai enum dan menambahkannya ke peta bersama dengan masa yang sesuai untuk memberikan nilai integer sebagai kunci:

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

Akhirnya, kami membuat kaedah statik yang mengambil integer timeToDelivery sebagai parameter. Kaedah ini mengembalikan nilai enum yang sesuai menggunakan peta masa statikToDeliveryToEnumValuesMapping :

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

Dengan menggunakan peta statik dan kaedah statik, kita mengambil nilai enum yang sesuai dengan waktu untuk memberikan nilai integer.

4. Kesimpulan

Sebagai kesimpulan, kami melihat beberapa penyelesaian untuk mendapatkan nilai enum yang sepadan dengan nilai integer.

Seperti biasa, semua contoh kod ini terdapat di GitHub.