JavaRush /Java блогу /Random-KY /Enum сапка айландыруу

Enum сапка айландыруу

Группада жарыяланган
Бүгүн биз сап сандары менен, тагыраагы, enumсаптык константалар менен өз ара аракеттенүүнү уюштурган класстар менен иштөө жөнүндө сүйлөшөбүз. Enumды сапка айландыруу - 1

String Enumerations колдонуу

Тиркемени иштеп чыгуу учурунда, сиз мезгил-мезгor менен сап баалуулуктарынын белгиленген топтому менен иштешиңиз керек. Бул эч нерсе болушу мүмкүн. Мисалы, тиркеме тарабынан колдоого алынган түс codeдорунун тизмеси же биздин тиркеме өз ара аракеттене ала турган түзмөктөрдүн тизмеси, мезгилдер ж.б. Мунун баары жалпы структурасы бар саптык константалардын алдын ала аныкталган жыйындысы, алар менен Java codeунун деңгээлинде программалык өз ара аракеттенүүнү орнотуу зарыл. Алдын ала аныкталган сап (жана башка) константалар топтому менен иштешүү керек болгондо, эң жакшы чечим - өз классыңызды жазуу enum. enumТөмөндө биз конversionнын мисалдарын карап чыгабыз 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— иштеп чыгуу жана мүчүлүштүктөрдү оңдоо үчүн жергorктүү
Ошондой эле бул чөйрөлөрдүн ар бири үчүн 4 URL. Кээ бир маанилүү жагдайларга көңүл буралы.
  1. Ар бир URL биздин тизмедеги сап константасы: алар ар бир enumконстанттын жанында кашаа ичинде аныкталат.
  2. Ар бир константага окшош типтеги аргументти алган конструктор болушу керек enum.
  3. Конструктордун чөйрөсү privateже package private.
  4. Биз аныктаган сап константаларын сактай турган өзгөрмө - класс талаасын аныктоо керек. Саптык константалардын маанилерин сырттан колдонуу үчүн бул талаа үчүн алуу ыкмасын түзүшүңүз керек.

Саптардын саны боюнча кайталоо

Бул этапта биз бардык жеткorктүү маанилерди кайталай алабыз 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туруктууну алышыңыз керек. Бул үчүн бир нече варианттар бар. Жана алардын баары enumкласстын өзүндө жакшыртууну талап кылат. Вариант 1. Класс ичинде санап чыгуу. enumСиз сапты кабыл алып, аны класстын бардык баалуулуктары менен салыштыра турган ыкманы түзүшүңүз керек . Эгерде дал келүү бар болсо, метод каалаган тизмени кайтарат. EnvironmentБиздин мисал үчүн, класстын ичинде төмөнкү ыкманы түзүшүбүз керек :
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класс codeу:
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 Бул учурда, биз энумубуздун ичинде картаны түзүп, аны компиляция убагында бир жолу толтурабыз, андан кийин андан баалуулуктарды алабыз:
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
Бирок бул ыкманын да кемчorктери бар. Биринчиден, дагы көп code бар. Экинчиден, HashMapбардык enumбаалуулуктар колдонмонун эсинде биротоло сакталат. Көрүнүп тургандай, ар бир нерсенин оң жана терс жактары бар. Бирок enumкласстар, адатта, анчалык көп эмес баалуулуктарды сактай турганын эске алсак, кемчorктер дээрлик көрүнбөй калат. Эскертүү бар: эгерде мындай операция (String мааниси боюнча Java Enum алуу) тез-тез аткарылса, анда экинчи вариантты колдонуу жакшы. EnumСиз JavaRush курсунан бул тема жана жалпысынан сабактар ​​тууралуу көбүрөөк биле аласыз. Студенттер JavaRush программасын бешинчи деңгээлдеги биринчи лекциядаEnum үйрөнүшөт . Enumды сапка айландыруу - 2
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION