Programming

Enum 값을 문자열 리터럴로 사용

procodes 2020. 2. 29. 15:35
반응형

Enum 값을 문자열 리터럴로 사용


Enum에 저장된 값을 문자열 리터럴로 사용하는 가장 좋은 방법은 무엇입니까? 예를 들면 다음과 같습니다.

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3
}

그런 다음 나중에 Mode.mode1문자열 표현을로 반환 하는 사용할 수 있습니다 mode1. 계속 전화하지 않아도됩니다 Mode.mode1.toString().


당신은 할 수 없습니다. 네 가지 옵션이 여기 있다고 생각합니다. 네 가지 모두 솔루션을 제공하지만 약간 다른 접근 방식을 제공합니다 ...

옵션 1 : 내장형 name()열거 형을 사용하십시오. 특별한 명명 형식이 필요하지 않은 경우에는 완벽하게 사용할 수 있습니다.

    String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.

옵션 2 : 더 많은 제어를 원하면 열거 속성에 재정의 속성 추가

public enum Modes {
    mode1 ("Fancy Mode 1"),
    mode2 ("Fancy Mode 2"),
    mode3 ("Fancy Mode 3");

    private final String name;       

    private Modes(String s) {
        name = s;
    }

    public boolean equalsName(String otherName) {
        // (otherName == null) check is not needed because name.equals(null) returns false 
        return name.equals(otherName);
    }

    public String toString() {
       return this.name;
    }
}

옵션 3 : 열거 형 대신 정적 결승을 사용하십시오.

public final class Modes {

    public static final String MODE_1 = "Fancy Mode 1";
    public static final String MODE_2 = "Fancy Mode 2";
    public static final String MODE_3 = "Fancy Mode 3";

    private Modes() { }
}

옵션 4 : 인터페이스에는 모든 필드가 공개, 정적 및 최종적으로 있습니다.

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}

모든 열거 형에는 name () 및 valueOf (String) 메서드가 모두 있습니다. 전자는 열거 형의 문자열 이름을 반환하고 후자는 이름이 문자열 인 열거 형 값을 제공합니다. 찾고있는 것과 같은가요?

String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);

Enum 자체에는 정적 valueOf (Class, String)가 있으므로 사용할 수도 있습니다.

Modes mode = Enum.valueOf(Modes.class, name);

toString()각 열거 형 값 메서드를 재정의 할 수 있습니다 .

예:

public enum Country {

  DE {
    @Override
    public String toString() {
      return "Germany";
    }
  },
  IT {
    @Override
    public String toString() {
      return "Italy";
    }
  },
  US {
    @Override
    public String toString() {
      return "United States";
    }
  }

}

용법:

public static void main(String[] args) {
  System.out.println(Country.DE); // Germany
  System.out.println(Country.IT); // Italy
  System.out.println(Country.US); // United States
}

Benny Neugebauer가 언급했듯이 toString ()을 덮어 쓸 수 있습니다. 그러나 대신 각 열거 형 필드의 toString을 덮어 쓰면 다음과 같습니다.

public enum Country{
    SPAIN("España"),
    ITALY("Italia"),
    PORTUGAL("Portugal");


    private String value;

    Country(final String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue();
    }
}

정적 필드를 추가하여 모든 필드를 검색하고 모두 인쇄하는 등의 작업을 수행 할 수도 있습니다. getValue를 호출하여 각 Enum 항목과 관련된 문자열을 가져 오기만하면됩니다.


mode1.name()또는 String.valueOf(mode1). 그것보다 나아지지 않아 두려워


public enum Modes {
  MODE1("Mode1"),
  MODE2("Mode2"),
  MODE3("Mode3");

 private String value;
 public String getValue() {
    return value;
   }
 private Modes(String value) {
  this.value = value;
 } 
}

열거 형에서 문자열로 값을 가져 오려는 곳에서 아래와 같이 전화를 걸 수 있습니다.

Modes.MODE1.getvalue();

"Mode1"을 문자열로 반환합니다.


사용할 수는 Mode.mode1.name()있지만 종종이 작업을 수행 할 필요는 없습니다.

Mode mode =
System.out.println("The mode is "+mode);

내가 아는 한, 이름을 얻는 유일한 방법은

Mode.mode1.name();

그러나 실제로 이런 식으로 필요한 경우 다음을 수행 할 수 있습니다.

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

    private Modes(String s) {
        name = s;
    }
}

내 열거 형의 경우 각각 1 문자열로 할당되는 것을 생각하지 않습니다. 이것이 열거 형에 toString () 메서드를 구현하는 방법입니다.

enum Animal
{
    DOG, CAT, BIRD;
    public String toString(){
        switch (this) {
            case DOG: return "Dog";
            case CAT: return "Cat";
            case BIRD: return "Bird";
        }
        return null;
    }
}

간단하게 사용할 수 있습니다 :

""+ Modes.mode1

당신의 문제에 대한 나의 해결책!

import java.util.HashMap;
import java.util.Map;

public enum MapEnumSample {
    Mustang("One of the fastest cars in the world!"), 
    Mercedes("One of the most beautiful cars in the world!"), 
    Ferrari("Ferrari or Mercedes, which one is the best?");

    private final String description;
    private static Map<String, String> enumMap;

    private MapEnumSample(String description) {
        this.description = description;
    }

    public String getEnumValue() {
        return description;
    }

    public static String getEnumKey(String name) {
        if (enumMap == null) {
            initializeMap();
        }
        return enumMap.get(name);
    }

    private static Map<String, String> initializeMap() {
        enumMap = new HashMap<String, String>();
        for (MapEnumSample access : MapEnumSample.values()) {
            enumMap.put(access.getEnumValue(), access.toString());
        }
        return enumMap;
    }

    public static void main(String[] args) {

        // getting value from Description
        System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));

        // getting value from Constant
        System.out.println(MapEnumSample.Mustang.getEnumValue());

        System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
        System.out.println(MapEnumSample.Mercedes.getEnumValue());

        // doesnt exist in Enum
        System.out.println("Mustang or Mercedes, which one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");

        // exists in Enum
        System.out.println("Ferrari or Mercedes, wich one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");

    }
}

Enum은 조금 특별한 클래스입니다. 열거 형은 추가 필드를 저장하고 메서드 등을 구현할 수 있습니다. 예를 들어

public enum Modes {
    mode1('a'),
    mode2('b'),
    mode3('c'),
    ;
    char c;

    private Modes(char c) {
        this.c = c;
    }
    public char character() {
        return c;
    }
}

이제 당신은 말할 수 있습니다 :

System.out.println(Modes.mode1.character())

출력을 참조하십시오 : a


package com.common.test;

public  enum Days {


    monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"),
    thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday");

    private int id;
    private String desc;


    Days(int id,String desc){
        this.id=id;
        this.desc=desc;
    }

    public static String getDay(int id){

        for (Days day : Days.values()) {
            if (day.getId() == id) {
                return day.getDesc();
            }
        }
        return null;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }



};

이 방법은 다음과 함께 작동해야합니다 enum.

public enum MyEnum {
    VALUE1,
    VALUE2,
    VALUE3;

    public int getValue() {
        return this.ordinal();
    }

    public static DataType forValue(int value) {
        return values()[value];
    }

    public String toString() {
        return forValue(getValue()).name();
    }
}

public enum Environment
{
    PROD("https://prod.domain.com:1088/"),
    SIT("https://sit.domain.com:2019/"),
    CIT("https://cit.domain.com:8080/"),
    DEV("https://dev.domain.com:21323/");

    private String url;

    Environment(String envUrl) {
        this.url = envUrl;
    }

    public String getUrl() {
        return url;
    }
}

String prodUrl = Environment.PROD.getUrl();

인쇄됩니다 :

https://prod.domain.com:1088/

열거 형 문자열 상수에 대한이 디자인 은 대부분의 경우 작동합니다.


많은 시도 후이 솔루션을 제공했습니다

public static enum Operation {

    Addition, Subtraction, Multiplication, Division,;

    public String getUserFriendlyString() {
        if (this==Addition) {
            return " + ";
        } else if (this==Subtraction) {
            return " - ";
        } else if (this==Multiplication) {
            return " * ";
        } else if (this==Division) {
            return " / ";
        }
        return "undefined";
       }
}

당신은 이것을 시도 할 수 있습니다 :

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3;

    public String toString(){
        switch(this) {
            case some-really-long-string:
                return "some-really-long-string";
            case mode2:
                return "mode2";
            default: return "undefined";
        }
    }

}


이 유형이 유형 오류를 방지하기가 더 쉽다는 것을 알았습니다.

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3;

    String str;

    Modes(){
        this.str = super.name();
    }

    @Override
    @NonNull
    public String toString() {
        return str;
    }

그러나-이것은 log / println에서 String을 사용해야하거나 java가 toString () 메소드를 자동으로 컴파일 할 때마다 다음과 같은 코드 행에서 작동 할 수 있습니다->

// sample method that require (string,value)
intent.putExtra(Modes.mode1 ,shareElement.getMode()); // java error
// first argument enum does not return value

대신 위에서 언급했듯이 여전히 열거 형을 확장하고 다음과 .name() 같은 경우에 사용해야 합니다.

intent.putExtra(Modes.mode1.name() ,shareElement.getMode()); 

참고 URL : https://stackoverflow.com/questions/6667243/using-enum-values-as-string-literals



반응형