Dina iki kita bakal ngomong babagan nggarap enumerasi string, lan luwih khusus, karo
enum
kelas sing ngatur interaksi karo konstanta string.
Nggunakake Enumerasi String
Sajrone pangembangan aplikasi, sampeyan kudu ngoperasikake nilai senar kanthi periodik. Bisa wae. Contone, dhaptar kode warna sing didhukung aplikasi, utawa dhaptar piranti sing bisa digunakake kanggo interaksi, musim, lsp. Kabeh iki minangka set konstanta senar sing wis ditemtokake kanthi struktur umum, sing perlu kanggo nggawe interaksi program ing tingkat kode Jawa. Yen sampeyan kudu sesambungan karo set sing wis ditemtokake saka senar (lan liyane) konstanta, solusi sing paling apik kanggo nulisenum
kelas dhewe. Ing ngisor iki kita bakal ndeleng conto konversi enum
menyang string
.
Nggawe Enumerasi String
Ayo nggaweenum
kelas sing nyimpen dhaptar lingkungan sing beda kanggo nyebarake aplikasi, uga URL saben 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;
}
}
Ing kelas iki kita wis nemtokake 4 lingkungan:
PROD
- releaseTEST
- kanggo testing manualAUTO_TEST
- lingkungan kanggo autotestsDEV
- lokal kanggo pangembangan lan debugging
- Saben URL minangka konstanta senar ing enumerasi kita: ditetepake ing kurung ing jejere saben
enum
konstanta. - Mesthi ana konstruktor sing njupuk argumen saka jinis sing padha karo saben
enum
konstanta. - Ruang lingkup konstruktor
private
yaikupackage private
. - Sampeyan kudu nemtokake variabel - lapangan kelas sing bakal nyimpen konstanta senar sing wis ditemtokake. Sampeyan kudu nggawe metode getter kanggo lapangan iki supaya bisa nggunakake nilai konstanta string ing njaba.
Iterasi liwat enumerasi string
Ing tahap iki, kita wis bisa ngulang kabehenum
nilai sing kasedhiya, uga entuk konstanta senar sing ana gandhengane. Kanggo entuk kabeh nilai saka enum
kelas apa wae, sampeyan kudu nggunakake 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
Minangka bisa katon saka conto, kanggo print jeneng enum
pancet, kita liwati menyang cara System.out.println
, lan print url gadhah pancet iki, kita digunakake getter kita ditetepake.
Entuk konstanta senar saka enum
Kanggo entuk nilai konstanta string, kita uga bisa nelpon getter ingenum
konstanta apa wae:
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
Njupuk konstanta enum kanthi jeneng
Kadhangkala perlu kanggo entukenum
konstanta kanthi jeneng senar. Iki ditindakake kanthi nggunakake metode valueOf(String)
, sing ngasilake konstanta kanthi jeneng:
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
Nanging ati-ati dibutuhake ing kene. Yen metode kasebut ora nemokake enum
konstanta kanthi jeneng sing ditemtokake, pangecualian bakal dibuwang java.lang.IllegalArgumentException
.
Ngonversi String menyang Enum
Kadhangkala kabutuhan ngelawan muncul. Ngerti reganeenum
, entuk enum
konstanta dhewe. Sing. ing conto kita, ngerti alamat tartamtu, sampeyan kudu njaluk Environment
pancet cocog. Ana sawetara opsi kanggo nindakake iki. Lan kabeh mau mbutuhake perbaikan ing enum
kelas kasebut. Pilihan 1. Enumerasi ing njero kelas. Sampeyan kudu nggawe metode sing bakal nampa senar lan mbandhingake karo kabeh nilai enum
kelas. Yen ana sing cocog, cara kasebut bakal ngasilake enumerasi sing dikarepake. Contone, kita kudu Environment
nggawe metode ing ngisor iki ing 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 + "]");
}
Banjur kita bisa njaluk enum
saka senar kaya iki:
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 iki nduweni kekurangan. Saben wektu, kanggo entuk enum
konstanta, sampeyan kudu ngulang kabeh nilai lan nggawe sawetara mbandhingake. Penalti kinerja ing kasus iki bakal ditemtokake dening jumlah konstanta lan jumlah operasi sing padha. Cara liya kanggo ngrampungake masalah iki ora duwe masalah iki. 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: Panggunaan HashMap
Ing kasus iki, kita nggawe peta ing njero enum lan isi sapisan ing wektu kompilasi, banjur njupuk nilai kasebut:
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);
}
}
Ing babagan panggunaan, loro opsi kasebut padha:
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
Nanging cara iki uga duwe kekurangan. Kaping pisanan, ana luwih akeh kode. Lan kapindho, HashMap
kabeh enum
nilai bakal disimpen ing memori aplikasi kanthi permanen. Nalika sampeyan bisa ndeleng, kabeh wis Pros lan cons. Nanging considering sing enum
kelas biasane nyimpen ora dadi akeh nilai, cacat bakal meh ora katon. Ana caveat: yen operasi kasebut (entuk nilai Java Enum dening String) asring ditindakake, luwih becik nggunakake pilihan liya. Sampeyan bisa sinau luwih lengkap babagan topik iki lan Enum
kelas umume ing kursus JavaRush. Siswa sinau JavaRush Enum
wis ing kuliah pisanan ing tingkat lima .
GO TO FULL VERSION