JavaRush /Java блогы /Random-KK /Enum жолына түрлендіру

Enum жолына түрлендіру

Топта жарияланған
Бүгін біз жол нөмірлерімен, нақтырақ айтсақ, enumжол тұрақтыларымен өзара әрекеттесуді ұйымдастыратын сыныптармен жұмыс істеу туралы сөйлесетін боламыз. Enum жолына түрлендіру - 1

Жол нөмірлерін пайдалану

Қолданбаны әзірлеу кезінде жүйелі түрде жол мәндерінің бекітілген жиынымен жұмыс істеу қажет. Бұл кез келген нәрсе болуы мүмкін. Мысалы, қолданба қолдайтын түс codeтарының тізімі немесе қолданбамыз өзара әрекеттесе алатын құрылғылардың тізімі, маусымдар және т.б. Мұның бәрі жалпы құрылымы бар жолдық тұрақтылардың алдын ала анықталған жиыны, олармен Java code деңгейінде бағдарламаның өзара әрекеттесуін орнату қажет. Алдын ала анықталған жол (және басқа) тұрақтылар жиынымен әрекеттесу қажет болғанда, ең жақсы шешім - өзіңіздің 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— әзірлеу және жөндеу үшін жергілікті
Сондай-ақ осы орталардың әрқайсысы үшін 4 URL мекенжайы. Кейбір маңызды сәттерге назар аударайық.
  1. Әрбір URL мекенжайы біздің тізімдегі жол тұрақтысы болып табылады: олар әрбір тұрақтының жанындағы жақшада анықталады enum.
  2. Әрбір тұрақты мәнмен бірдей типтегі аргумент қабылдайтын конструктор болуы керек enum.
  3. Конструктордың ауқымы privateне болып табылады package private.
  4. Айнымалыны анықтау қажет - біз анықтаған жол тұрақтыларын сақтайтын класс өрісі. Жол тұрақтыларының мәндерін сырттан пайдалану үшін осы өріс үшін алу әдісін жасау керек.

Жол нөмірлерінің қайталануы

Бұл кезеңде біз барлық қол жетімді мәндерді қайталай аламыз 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
Бірақ бұл әдістің де кемшіліктері бар. Біріншіден, әлдеқайда көп code бар. Екіншіден, HashMapбарлық enumмәндер қолданба жадында тұрақты сақталады. Көріп отырғаныңыздай, әр нәрсенің жақсы және жаман жақтары бар. Бірақ сыныптар әдетте соншалықты көп емес мәндерді сақтайтынын ескере отырып enum, кемшіліктер дерлік байқалмайды. Ескерту бар: егер мұндай операция (Жол мәні бойынша Java Enum алу) жиі орындалса, екінші опцияны қолданған дұрыс. EnumJavaRush курсында осы тақырып және жалпы сабақтар туралы көбірек біле аласыз. Студенттер JavaRush тілін бесінші деңгейдің бірінші лекциясындаEnum үйренеді . Enum жолына түрлендіру - 2
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION