Имрӯз мо дар бораи кор бо рӯйхатҳои сатр ва аниқтараш бо
enum
синфҳое сӯҳбат хоҳем кард, ки мутақобиларо бо константаҳои сатр ташкил мекунанд.
Истифодаи рақамҳои сатр
Ҳангоми таҳияи барнома, шумо бояд давра ба давра дар маҷмӯи собит арзишҳои сатр амал кунед. Он метавонад чизе бошад. Масалан, рӯйхати рамзҳои рангҳои аз ҷониби барнома дастгирӣшаванда ё рӯйхати дастгоҳҳое, ки замимаи мо бо онҳо ҳамкорӣ карда метавонад, фаслҳо ва ғайра. Њамаи ин маљмўи пешакї муќарраршудаи константањои сатри дорои сохтори умумист, ки бо онњо њамкории барномаро дар сатњи codeи Java муќаррар кардан лозим аст. Вақте ки ба шумо лозим меояд, ки бо маҷмӯи пешакӣ муайяншудаи сатр (ва дигар) доимӣ муошират кунед, беҳтарин роҳи ҳалли он ин навиштаниenum
синфи шахсии шумост. Дар зер мо мисолҳои табдил enum
ба string
.
Эҷоди рақамҳои сатр
Биёедenum
синферо эҷод кунем, ки рӯйхати муҳитҳои гуногунро барои ҷойгиркунии барнома ва инчунин URL-и ҳар як муҳит нигоҳ медорад:
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;
}
}
Дар ин синф мо 4 муҳити зистро муайян кардем:
PROD
- озод карданTEST
— барои санчиши дастйAUTO_TEST
— муҳит барои санҷишҳои автоматӣDEV
— маҳаллӣ барои таҳия ва ислоҳ
- Ҳар як URL як сатри доимӣ дар рӯйхати мост: онҳо дар қавс дар паҳлӯи ҳар як
enum
доимӣ муайян карда мешаванд. - Бояд конструкторе бошад, ки аргументи як навъро бо ҳар як
enum
доимӣ мегирад. - Доираи конструктор
private
ёpackage private
. - Тағирёбанда - майдони синфро муайян кардан лозим аст, ки константаҳои сатри муайянкардаамонро нигоҳ медорад. Барои истифода бурдани арзишҳои доимии сатр, шумо бояд барои ин майдон як усули гетер эҷод кунед.
Итератсия аз болои рӯйхатҳои сатр
Дар ин марҳила, мо метавонем аллакай аз болои ҳамаиenum
арзишҳои дастрас такрор кунем ва инчунин константаҳои сатри бо онҳо алоқамандро ба даст орем. Барои гирифтани ҳамаи арзишҳои ягон enum
синф, шумо бояд усули зеринро истифода баред values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Хулоса:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Тавре ки аз мисол дида мешавад, барои чопи номи enum
доимӣ мо онро ба усули гузаронидем System.out.println
ва барои чопи url-и бо ин константа алоқаманд, мо гетереро, ки муайян карда будем, истифода бурдем.
Гирифтани доимии сатр аз enum
Барои ба даст овардани арзиши ягон доимии сатр, мо инчунин метавонем қабулкунандаро дар ҳама гуна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);
}
}
Хулоса:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Гирифтани доимии рақамҳо аз рӯи ном
enum
Баъзан аз рӯи номи сатри он доимӣ гирифтан лозим меояд . Ин бо истифода аз метод анҷом дода мешавад valueOf(String)
, ки константаро бо номи худ бармегардонад:
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());
}
}
Хулоса:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Аммо дар ин ҷо эҳтиёт лозим аст. Агар усул доимӣ бо номи нишондодашударо наёбад enum
, истисно партофта мешавад java.lang.IllegalArgumentException
.
Табдил додани сатр ба Enum
Баъзан зарурати баръакс ба миён меояд. Донистани арзишenum
, enum
худи доимиро гиред. Онхое. дар мисоли мо, донистани суроғаи муайян, шумо бояд Environment
доимии мувофиқро гиред. Якчанд вариантҳо барои ин кор вуҷуд доранд. Ва ҳамаи онҳо такмor enum
худи синфро талаб мекунанд. Варианти 1. Барӯйхатгирӣ дар дохor синф. Шумо бояд усулеро эҷод кунед, ки сатрро қабул кунад ва онро бо тамоми арзишҳои enum
синф муқоиса кунад. Агар мувофиқат мавҷуд бошад, усул рақами дилхоҳро бармегардонад. Барои мисоли мо, мо бояд Environment
дар дохor синф усули зеринро эҷод кунем:
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 + "]");
}
Он гоҳ мо метавонем enum
аз сатр чунин ба даст орем:
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);
}
}
Хулоса:
Environment name for url=[http://localhost:8080] is: DEV
Ин равиш нуқсонҳои худро дорад. Ҳар дафъа, барои ба даст овардани enum
як доимӣ, шумо бояд тамоми арзишҳоро такрор кунед ва миқдори муайяни муқоисаҳоро анҷом диҳед. Ҷазои иҷроиш дар ин ҳолат аз рӯи шумораи константаҳо ва шумораи амалиёти шабеҳ муайян карда мешавад. Усули дуюми ҳалли ин мушкилот ин мушкилотро надорад. Рамзи пурраи Enum
синф:
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 + "]");
}
}
Варианти 2: Истифода HashMap
Дар ин ҳолат, мо дар дохor рақами худ харита эҷод мекунем ва онро як маротиба дар вақти тартибдиҳӣ пур мекунем ва сипас арзишҳоро аз он мегирем:
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);
}
}
Дар робита ба истифода, ҳарду вариантҳо якхелаанд:
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);
}
}
Хулоса:
Environment name for url=[http://localhost:8080] is: DEV
Аммо ин усул камбудиҳо низ дорад. Аввалан, рамзи бештар вуҷуд дорад. Ва дуюм, HashMap
ҳама enum
арзишҳо дар хотираи барнома ба таври доимӣ нигоҳ дошта мешаванд. Тавре ки шумо мебинед, ҳама чиз мусбат ва манфӣ дорад. Аммо бо назардошти он, ки enum
дарсҳо одатан арзишҳои зиёд надоранд, камбудиҳо қариб ноаён хоҳанд буд. Огоҳӣ вуҷуд дорад: агар чунин амалиёт (гирифтани Java Enum аз рӯи арзиши сатр) зуд-зуд иҷро карда шавад, беҳтар аст, ки варианти дуюмро истифода баред. Шумо метавонед дар бораи ин мавзӯъ ва Enum
умуман дарсҳо дар курси JavaRush маълумоти бештар гиред. Enum
Донишҷӯён JavaRush-ро аллакай дар лексияи якуми сатҳи панҷум меомӯзанд .
GO TO FULL VERSION