Ngayon ay pag-uusapan natin ang tungkol sa pagtatrabaho sa mga enumerasyon ng string, at higit na partikular, sa
enum
mga klase na nag-aayos ng pakikipag-ugnayan sa mga string constant.
Paggamit ng String Enumerations
Sa panahon ng pagbuo ng application, pana-panahong kailangan mong magpatakbo sa isang nakapirming hanay ng mga halaga ng string. Maaaring kahit ano. Halimbawa, isang listahan ng mga color code na sinusuportahan ng application, o isang listahan ng mga device kung saan maaaring makipag-ugnayan ang aming application, mga season, atbp. Ang lahat ng ito ay isang paunang-natukoy na hanay ng mga string constant na may isang karaniwang istraktura, kung saan kinakailangan upang magtatag ng pakikipag-ugnayan ng programa sa antas ng Java code. Kapag kailangan mong makipag-ugnayan sa isang paunang natukoy na hanay ng mga string (at iba pang) constants, ang pinakamagandang solusyon ay ang pagsulat ng sarili mongenum
klase. Sa ibaba ay titingnan natin ang mga halimbawa ng conversion enum
sa string
.
Paglikha ng String Enumerations
Gumawa tayoenum
ng klase na nag-iimbak ng listahan ng iba't ibang environment para sa pag-deploy ng application, pati na rin ang URL ng bawat environment:
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;
}
}
Sa klase na ito, tinukoy namin ang 4 na kapaligiran:
PROD
- pakawalanTEST
- para sa manu-manong pagsubokAUTO_TEST
— kapaligiran para sa mga autotestDEV
— lokal para sa pag-unlad at pag-debug
- Ang bawat URL ay isang string constant sa aming enumeration: ang mga ito ay tinukoy sa mga panaklong sa tabi ng bawat
enum
constant. - Dapat mayroong isang constructor na tumatagal ng argumento ng parehong uri ng bawat
enum
pare-pareho. - Ang saklaw ng constructor ay
private
alinman sapackage private
. - Kinakailangang tukuyin ang isang variable - isang field ng klase na mag-iimbak ng mga string constant na aming tinukoy. Dapat kang lumikha ng isang getter method para sa field na ito upang magamit ang mga value ng string constants sa labas.
Pag-ulit sa mga enumerasyon ng string
Sa yugtong ito, maaari na tayong umulit sa lahat ng magagamitenum
na mga halaga, pati na rin makakuha ng mga string constant na nauugnay sa kanila. Upang makuha ang lahat ng mga halaga ng anumang enum
klase, kailangan mong gamitin ang pamamaraan values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Konklusyon:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Tulad ng makikita mula sa halimbawa, upang i-print ang pangalan ng enum
pare-pareho, ipinasa namin ito sa pamamaraan System.out.println
, at upang i-print ang url na nauugnay sa pare-parehong ito, ginamit namin ang getter na tinukoy namin.
Pagkuha ng string constant mula sa enum
Upang makuha ang halaga ng anumang string constant, maaari din tayong tumawag ng getter sa anumangenum
constant:
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);
}
}
Konklusyon:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Pagkuha ng enum constant sa pamamagitan ng pangalan
Minsan ito ay kinakailangan upang makakuhaenum
ng isang pare-pareho sa pamamagitan ng kanyang pangalan ng string. Ginagawa ito gamit ang method valueOf(String)
, na nagbabalik ng constant sa pamamagitan ng pangalan nito:
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());
}
}
Konklusyon:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ngunit kailangan ang pag-iingat dito. Kung ang pamamaraan ay hindi makahanap enum
ng isang pare-pareho na may tinukoy na pangalan, isang pagbubukod ay itatapon java.lang.IllegalArgumentException
.
Pag-convert ng String sa Enum
Minsan ang kabaligtaran na pangangailangan ay lumitaw. Pag-alam sa halagaenum
, kunin enum
ang pare-pareho mismo. Yung. sa aming halimbawa, alam ang isang tiyak na address, kailangan mong makuha ang Environment
kaukulang pare-pareho. Mayroong ilang mga pagpipilian upang gawin ito. At lahat ng mga ito ay nangangailangan ng pagpapabuti sa enum
klase mismo. Pagpipilian 1. Enumerasyon sa loob ng klase. Kailangan mong lumikha ng isang paraan na tatanggap ng isang string at ihambing ito sa lahat ng mga halaga enum
ng klase. Kung may tugma, ibabalik ng pamamaraan ang nais na enumeration. Para sa aming halimbawa, kailangan naming Environment
lumikha ng sumusunod na pamamaraan sa loob ng klase:
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 + "]");
}
Pagkatapos ay makakakuha tayo enum
mula sa string tulad nito:
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);
}
}
Konklusyon:
Environment name for url=[http://localhost:8080] is: DEV
Ang diskarte na ito ay may mga downsides. Sa bawat oras, upang makakuha enum
ng isang pare-pareho, kailangan mong umulit sa lahat ng mga halaga at gumawa ng isang tiyak na bilang ng mga paghahambing. Ang parusa sa pagganap sa kasong ito ay matutukoy sa pamamagitan ng bilang ng mga constant at ang bilang ng mga katulad na operasyon. Ang pangalawang paraan ng paglutas ng problemang ito ay walang problemang ito. Buong Enum
code ng klase:
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 + "]");
}
}
Pagpipilian 2: Paggamit HashMap
Sa kasong ito, lumikha kami ng isang mapa sa loob ng aming enum at i-populate ito nang isang beses sa oras ng pag-compile, at pagkatapos ay kunin ang mga halaga mula dito:
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);
}
}
Sa mga tuntunin ng paggamit, ang parehong mga pagpipilian ay magkapareho:
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);
}
}
Konklusyon:
Environment name for url=[http://localhost:8080] is: DEV
Ngunit ang pamamaraang ito ay mayroon ding mga disadvantages. Una, marami pang code. At pangalawa, HashMap
ang lahat enum
ng mga halaga ay permanenteng maiimbak sa memorya ng application. Tulad ng nakikita mo, ang lahat ay may mga kalamangan at kahinaan. Ngunit kung isasaalang-alang na enum
ang mga klase ay karaniwang nag-iimbak ng hindi napakaraming halaga, ang mga kawalan ay halos hindi mapapansin. Mayroong isang caveat: kung ang naturang operasyon (pagkuha ng Java Enum sa pamamagitan ng String value) ay madalas na isinasagawa, mas mahusay na gamitin ang pangalawang opsyon. Maaari kang matuto nang higit pa tungkol sa paksang ito at Enum
mga klase sa pangkalahatan sa kursong JavaRush. Natututo Enum
na ang mga estudyante ng JavaRush sa unang lecture ng ikalimang antas .
GO TO FULL VERSION