Hari ini kita akan berbicara tentang bekerja dengan enumerasi string, dan lebih khusus lagi, dengan
enum
kelas yang mengatur interaksi dengan konstanta string.
Menggunakan Enumerasi String
Selama pengembangan aplikasi, Anda secara berkala perlu mengoperasikan sekumpulan nilai string yang tetap. Itu bisa berupa apa saja. Misalnya, daftar kode warna yang didukung oleh aplikasi, atau daftar perangkat yang dapat berinteraksi dengan aplikasi kita, musim, dll. Semua ini adalah kumpulan konstanta string yang telah ditentukan sebelumnya dengan struktur umum yang diperlukan untuk membangun interaksi program pada tingkat kode Java. Saat Anda perlu berinteraksi dengan sekumpulan konstanta string (dan lainnya) yang telah ditentukan sebelumnya, solusi terbaik adalah dengan menulisenum
kelas Anda sendiri. Di bawah ini kita akan melihat contoh konversi enum
ke string
.
Membuat Enumerasi String
Mari buatenum
kelas yang menyimpan daftar lingkungan berbeda untuk menyebarkan aplikasi, serta URL setiap lingkungan:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
Di kelas ini kami telah mendefinisikan 4 lingkungan:
PROD
- melepaskanTEST
— untuk pengujian manualAUTO_TEST
— lingkungan untuk tes otomatisDEV
— lokal untuk pengembangan dan debugging
- Setiap URL adalah konstanta string dalam enumerasi kami: URL tersebut didefinisikan dalam tanda kurung di samping setiap
enum
konstanta. - Harus ada konstruktor yang mengambil argumen dengan tipe yang sama dengan setiap
enum
konstanta. - Ruang lingkup konstruktornya
private
adalahpackage private
. - Penting untuk mendefinisikan variabel - bidang kelas yang akan menyimpan konstanta string yang telah kita definisikan. Anda harus membuat metode pengambil untuk bidang ini agar dapat menggunakan nilai konstanta string secara eksternal.
Iterasi pada enumerasi string
Pada tahap ini, kita sudah dapat mengulangi semuaenum
nilai yang tersedia, serta mendapatkan konstanta string yang terkait dengannya. Untuk mendapatkan semua nilai enum
kelas mana pun, Anda perlu menggunakan metode values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Kesimpulan:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Seperti dapat dilihat dari contoh, untuk mencetak nama enum
konstanta, kami meneruskannya ke metode System.out.println
, dan untuk mencetak url yang terkait dengan konstanta ini, kami menggunakan pengambil yang kami tentukan.
Mendapatkan konstanta string dari enum
Untuk mendapatkan nilai konstanta string apa pun, kita juga dapat memanggil pengambilenum
konstanta apa pun:
public class Main {
public static void main(String[] args) {
String prodUrl = Environment.PROD.getUrl();
String devUrl = Environment.DEV.getUrl();
System.out.println("Production url is: " + prodUrl);
System.out.println("Development url is: " + devUrl);
}
}
Kesimpulan:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Mendapatkan enum konstan berdasarkan nama
Terkadang perlu untuk mendapatkanenum
konstanta berdasarkan nama stringnya. Hal ini dilakukan dengan menggunakan metode valueOf(String)
yang mengembalikan konstanta berdasarkan namanya:
public class Main {
public static void main(String[] args) {
Environment prod = Environment.valueOf("PROD");
Environment dev = Environment.valueOf("DEV");
System.out.println("Production url is: " + prod.getUrl());
System.out.println("Development url is: " + dev.getUrl());
}
}
Kesimpulan:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Namun kehati-hatian diperlukan di sini. Jika metode tidak menemukan enum
konstanta dengan nama yang ditentukan, pengecualian akan diberikan java.lang.IllegalArgumentException
.
Mengonversi String ke Enum
Terkadang kebutuhan sebaliknya muncul. Mengetahui nilainyaenum
, dapatkan enum
konstanta itu sendiri. Itu. dalam contoh kita, mengetahui alamat tertentu, Anda perlu mendapatkan Environment
konstanta yang sesuai. Ada beberapa pilihan untuk melakukan hal ini. Dan semuanya memerlukan perbaikan di enum
kelas itu sendiri. Pilihan 1. Pencacahan di dalam kelas. Anda perlu membuat metode yang akan menerima string dan membandingkannya dengan semua nilai enum
kelas. Jika ada kecocokan, metode akan mengembalikan enumerasi yang diinginkan. Sebagai contoh, kita perlu Environment
membuat metode berikut di dalam kelas:
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
// либо equalsIgnoreCase, на ваше усмотрение
if (env.getUrl().equals(url)) {
return env;
}
}
// Либо просто вернуть null
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
Kemudian kita bisa mendapatkan enum
dari string seperti ini:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Kesimpulan:
Environment name for url=[http://localhost:8080] is: DEV
Pendekatan ini memiliki kelemahan. Setiap kali, untuk mendapatkan enum
konstanta, Anda harus mengulangi semua nilai dan membuat sejumlah perbandingan. Penalti kinerja dalam hal ini akan ditentukan oleh jumlah konstanta dan jumlah operasi serupa. Metode kedua untuk menyelesaikan masalah ini tidak memiliki masalah ini. Enum
Kode kelas lengkap :
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
if (env.getUrl().equals(url)) {
return env;
}
}
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
}
Opsi 2: Penggunaan HashMap
Dalam hal ini, kami membuat peta di dalam enum kami dan mengisinya satu kali pada waktu kompilasi, lalu mengambil nilainya darinya:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
// Создаем static final карту
private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();
// Заполняем её всеми значениями
static {
for (Environment env : values()) {
LOOKUP_MAP.put(env.getUrl(), env);
}
}
// Возвращаем Environment по строковому url
public static Environment getEnvByUrl(String url) {
return LOOKUP_MAP.get(url);
}
}
Dalam hal penggunaan, kedua opsi tersebut identik:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Kesimpulan:
Environment name for url=[http://localhost:8080] is: DEV
Namun cara ini juga memiliki kelemahan. Pertama, ada lebih banyak kode. Dan kedua, HashMap
semua enum
nilai akan disimpan di memori aplikasi secara permanen. Seperti yang Anda lihat, segala sesuatu memiliki pro dan kontra. Namun mengingat enum
kelas biasanya tidak menyimpan banyak nilai, kerugiannya hampir tidak terlihat. Ada peringatan: jika operasi seperti itu (mendapatkan Java Enum berdasarkan nilai String) sering dilakukan, lebih baik menggunakan opsi kedua. Anda dapat mempelajari lebih lanjut tentang topik ini dan Enum
kelas-kelas secara umum di kursus JavaRush. Siswa Enum
sudah mempelajari JavaRush pada kuliah pertama tingkat kelima .
GO TO FULL VERSION