enum
Bu gün biz sətir nömrələri ilə, daha dəqiq desək, sətir sabitləri ilə qarşılıqlı əlaqəni təşkil edən siniflərlə işləmək haqqında danışacağıq .
String Enumerations istifadə
Tətbiqin inkişafı zamanı siz vaxtaşırı sabit sətir dəyərləri dəsti üzərində işləməlisiniz. Hər şey ola bilər. Məsələn, proqram tərəfindən dəstəklənən rəng kodlarının siyahısı və ya tətbiqimizin qarşılıqlı əlaqədə ola biləcəyi cihazların siyahısı, fəsillər və s. Bütün bunlar, Java kodu səviyyəsində proqram qarşılıqlı əlaqəsini qurmaq lazım olan ümumi bir quruluşa malik olan əvvəlcədən təyin edilmiş sətir sabitləri dəstidir. Əvvəlcədən təyin edilmiş sətir (və digər) sabitlər dəsti ilə qarşılıqlı əlaqə yaratmağınız lazım olduqda, ən yaxşı həll öz sinfinizi yazmaqdır
enum
.
enum
Aşağıda çevrilmə nümunələrinə baxacağıq
string
.
Simli nömrələrin yaradılması
enum
Tətbiqin yerləşdirilməsi üçün müxtəlif mühitlərin siyahısını, eləcə də hər bir mühitin URL-sini saxlayan sinif yaradaq :
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;
}
}
Bu sinifdə biz 4 mühit müəyyən etdik:
PROD
- buraxılış
TEST
- əllə sınaq üçün
AUTO_TEST
— avtotestlər üçün mühit
DEV
— inkişaf və sazlama üçün yerli
Həm də bu mühitlərin hər biri üçün 4 URL. Bəzi vacib məqamlara diqqət yetirək.
- Hər bir URL bizim siyahımızda sətir sabitidir: onlar hər bir
enum
sabitin yanında mötərizədə müəyyən edilir.
- Hər bir sabitlə eyni tipli arqument götürən konstruktor olmalıdır
enum
.
- Konstruktorun əhatə dairəsi
private
yadır package private
.
- Dəyişən müəyyən etmək lazımdır - müəyyən etdiyimiz sətir sabitlərini saxlayacaq sinif sahəsi. Sətir sabitlərinin dəyərlərindən xaricdən istifadə etmək üçün bu sahə üçün alıcı metodu yaratmalısınız.
Sətir nömrələri üzərində təkrarlama
Bu mərhələdə biz artıq bütün mövcud
enum
dəyərləri təkrarlaya, həmçinin onlarla əlaqəli sətir sabitlərini əldə edə bilərik. İstənilən sinifin bütün dəyərlərini əldə etmək üçün
enum
metoddan istifadə etməlisiniz
values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Nəticə:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Nümunədən göründüyü kimi,
enum
sabitin adını çap etmək üçün onu metoda
System.out.println
, bu sabitlə əlaqəli url-i çap etmək üçün isə müəyyən etdiyimiz getterdən istifadə etdik.
Enumdan sətir sabitinin alınması
İstənilən sətir sabitinin qiymətini əldə etmək üçün istənilən sabitdə alıcı çağıra bilərik
enum
:
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);
}
}
Nəticə:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Adla nömrə sabitinin alınması
enum
Bəzən sətir adı ilə sabiti almaq lazımdır .
valueOf(String)
Bu , adı ilə sabiti qaytaran metoddan istifadə etməklə edilir :
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());
}
}
Nəticə:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ancaq burada ehtiyatlı olmaq lazımdır. Metod göstərilən adla sabit tapmasa
enum
, istisna atılacaq
java.lang.IllegalArgumentException
.
Sətirin Enum-a çevrilməsi
Bəzən əks ehtiyac yaranır. Dəyərini bilməklə
enum
,
enum
sabitin özünü əldə edin. Bunlar. nümunəmizdə müəyyən bir ünvanı bilməklə müvafiq
Environment
sabiti əldə etməlisiniz. Bunu etmək üçün bir neçə variant var. Və onların hamısı
enum
sinfin özündə təkmilləşdirmə tələb edir. Seçim 1. Sinif daxilində siyahıyaalma.
enum
Bir sətri qəbul edəcək və onu sinfin bütün dəyərləri ilə müqayisə edəcək bir üsul yaratmalısınız . Uyğunluq varsa, metod istədiyiniz nömrəni qaytaracaq. Məsələn, biz
Environment
sinif daxilində aşağıdakı metodu yaratmalıyıq:
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 + "]");
}
enum
Sonra sətirdən belə əldə edə bilərik :
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);
}
}
Nəticə:
Environment name for url=[http://localhost:8080] is: DEV
Bu yanaşmanın mənfi cəhətləri var. Hər dəfə
enum
bir sabit əldə etmək üçün bütün dəyərləri təkrarlamalı və müəyyən sayda müqayisə etməli olacaqsınız. Bu halda icra cəzası sabitlərin sayı və oxşar əməliyyatların sayı ilə müəyyən ediləcək. Bu problemi həll etməyin ikinci üsulunda bu problem yoxdur. Tam
Enum
sinif kodu:
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 + "]");
}
}
Seçim 2: İstifadə
HashMap
Bu halda, biz öz nömrəmizin daxilində bir xəritə yaradırıq və onu tərtib zamanı bir dəfə doldururuq və sonra dəyərləri oradan götürürük:
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;
}
private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();
static {
for (Environment env : values()) {
LOOKUP_MAP.put(env.getUrl(), env);
}
}
public static Environment getEnvByUrl(String url) {
return LOOKUP_MAP.get(url);
}
}
İstifadə baxımından hər iki seçim eynidir:
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);
}
}
Nəticə:
Environment name for url=[http://localhost:8080] is: DEV
Ancaq bu metodun mənfi cəhətləri də var. Birincisi, daha çox kod var. İkincisi,
HashMap
bütün
enum
dəyərlər proqram yaddaşında qalıcı olaraq saxlanılacaq. Gördüyünüz kimi, hər şeyin müsbət və mənfi tərəfləri var. Ancaq siniflərin adətən o qədər də çox dəyər saxlamadığını nəzərə alsaq
enum
, çatışmazlıqlar demək olar ki, görünməz olacaqdır. Bir xəbərdarlıq var: belə bir əməliyyat (String dəyəri ilə Java Enum əldə etmək) tez-tez həyata keçirilirsə, ikinci variantdan istifadə etmək daha yaxşıdır.
Enum
JavaRush kursunda bu mövzu və ümumilikdə dərslər haqqında daha çox məlumat əldə edə bilərsiniz. Tələbələr JavaRush-u
Enum
artıq
beşinci səviyyənin ilk mühazirəsində öyrənirlər .
GO TO FULL VERSION