JavaRush /Java Blog /Random-KO /열거형을 문자열로 변환

열거형을 문자열로 변환

Random-KO 그룹에 게시되었습니다
오늘은 문자열 열거 작업, 더 구체적으로 enum문자열 상수와의 상호 작용을 구성하는 클래스 작업에 대해 이야기하겠습니다. 열거형을 문자열로 변환 - 1

문자열 열거 사용

애플리케이션을 개발하는 동안 정기적으로 고정된 문자열 값 집합에 대해 작업을 수행해야 합니다. 무엇이든 될 수 있습니다. 예를 들어 애플리케이션에서 지원하는 색상 코드 목록, 애플리케이션이 상호 작용할 수 있는 장치 목록, 계절 등이 있습니다. 이 모든 것은 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— 개발 및 디버깅을 위한 로컬
또한 이러한 각 환경에 대한 4개의 URL도 있습니다. 몇 가지 중요한 사항에 주목합시다.
  1. 각 URL은 열거형의 문자열 상수입니다. URL은 각 상수 옆의 괄호 안에 정의되어 있습니다 enum.
  2. 각 상수와 동일한 유형의 인수를 취하는 생성자가 있어야 합니다 enum.
  3. 생성자의 범위는 private입니다 package private.
  4. 우리가 정의한 문자열 상수를 저장할 클래스 필드인 변수를 정의해야 합니다. 문자열 상수 값을 외부에서 사용하려면 이 필드에 대한 getter 메서드를 만들어야 합니다.

문자열 열거 반복

이 단계에서는 이미 사용 가능한 모든 값을 반복할 수 있을 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을 인쇄하기 위해 정의한 getter를 사용했습니다.

enum에서 문자열 상수 얻기

문자열 상수의 값을 얻으려면 상수에 대해 getter를 호출할 수도 있습니다 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저것들. 이 예에서는 특정 주소를 알고 있으므로 해당 상수를 가져와야 합니다 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수업 코드:
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
하지만 이 방법에도 단점이 있습니다. 첫째, 코드가 훨씬 더 많습니다. 둘째, HashMap모든 enum값은 애플리케이션 메모리에 영구적으로 저장됩니다. 보시다시피 모든 것에는 장단점이 있습니다. 그러나 enum클래스는 일반적으로 그다지 많은 값을 저장하지 않는다는 점을 고려하면 단점은 거의 눈에 띄지 않을 것입니다. 주의할 점이 있습니다. 이러한 작업(문자열 값으로 Java Enum 가져오기)을 자주 수행하는 경우 두 번째 옵션을 사용하는 것이 좋습니다. JavaRush 과정에서 이 주제와 Enum일반적인 클래스에 대해 자세히 알아볼 수 있습니다. 학생들은 5레벨의 첫 번째 강의Enum 에서 이미 JavaRush를 배웁니다 . 열거형을 문자열로 변환 - 2
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION