열거 형 문자열을 만드는 가장 좋은 방법은 무엇입니까?


364

enum유형이 문자열 집합을 나타내는 가장 좋은 방법은 무엇입니까 ?

나는 이것을 시도했다 :

enum Strings{
   STRING_ONE("ONE"), STRING_TWO("TWO")
}

그런 다음 어떻게 그들을 사용할 수 Strings있습니까?

답변:


605

나는 당신이 무엇을하고 싶은지 모르겠지만 이것이 실제로 예제 코드를 번역 한 방법입니다 ....

package test;

/**
 * @author The Elite Gentleman
 *
 */
public enum Strings {
    STRING_ONE("ONE"),
    STRING_TWO("TWO")
    ;

    private final String text;

    /**
     * @param text
     */
    Strings(final String text) {
        this.text = text;
    }

    /* (non-Javadoc)
     * @see java.lang.Enum#toString()
     */
    @Override
    public String toString() {
        return text;
    }
}

또는에 대한 getter 메소드를 작성할 수 있습니다 text.

이제 할 수 있습니다 Strings.STRING_ONE.toString();


3
그것이 컴파일러 요구 사항인지는 모르겠지만 private String text최종적이어야합니다.
— Jonathan

7
@ Tomás Narros 예, 최종 선언시 값을 제공하지 않는 한 생성자에서 할당 할 수 있습니다.
— Jonathan

28
@The Elite Gentleman 열거 형 상수의 값이 런타임 중에 변경되면 나쁠 수 있으므로 필요하지 않더라도 final가장 좋습니다.
— Jonathan

8
이 열거 형을 잊지 마세요로 구성 할 수없는 new생성자 그대로 private. 본질적으로 객체 생성은 금지되며이 final경우 실제로 필요하지 않습니다.
— Buhake Sindi

6
@BuhakeSindi : 사실이지만 우연히 setText(String)열거 형을 사용 하는 경향이 final있으며 컴파일러 지원을 통해 상수라는 도대체 문서를 밝힐 수 있습니다 . String상수 를 사용 한다면로 선언하지 않을 것입니다 public static String.
— TWiStErRob 2016 년

104

열거 형의 사용자 정의 문자열 값

에서 http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html

java enum의 기본 문자열 값은 액면 값 또는 요소 이름입니다. 그러나 toString () 메서드를 재정 의하여 문자열 값을 사용자 지정할 수 있습니다. 예를 들어

public enum MyType {
  ONE {
      public String toString() {
          return "this is one";
      }
  },

  TWO {
      public String toString() {
          return "this is two";
      }
  }
}

다음 테스트 코드를 실행하면 다음이 생성됩니다.

public class EnumTest {
  public static void main(String[] args) {
      System.out.println(MyType.ONE);
      System.out.println(MyType.TWO);
  }
}


this is one
this is two

16
이것은 효율적인 방법 이 아닙니다 . 열거 형의 모든 값에 대해 새 사용자 정의 클래스를 작성합니다. 위의 예에서는 상기에서 다음을 볼 수 binEnumTest $ MyType.class EnumTest $합니다 MyType $ 1.class EnumTest $합니다 MyType $ 2.class 추가 할 것입니다 : 디렉토리 진짜 빠른합니다. 열거 형 생성자에 값을 전달하여 예상 답변으로 수행하는 것이 가장 좋습니다. 나는 실제로 재정의에 동의하지 않습니다 toString(). 열거 형의 다른 사용자가 getKey()재정의를 toString()예상 할 수 없으므로 명시 적 getter를 사용하는 것이 좋습니다 .
— 매트 퀴 글리

@MattQuigley에 전적으로 동의합니다. 그렇게함으로써 사용자는 toString을 사용해서는 안되는 것들을 사용하도록 권장합니다. 레이블이 필요한 경우 레이블 속성을 추가하는 것이 좋습니다.
— Sebastien Lorber

또한 (열에서 열거 형 객체로) 다른 방향으로 갈 수있는 방법이 없으므로 언젠가 필요할 것입니다.
— Adrian Smith

toString을 재정의해도 valueOf ()에 영향을 미치지 않습니까?
— Dmitriusan

69

그 name()방법을 사용하십시오 :

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Strings.ONE.name());
    }
}

enum Strings {
    ONE, TWO, THREE
}

수율 ONE.


17
네,하지만 Strings.STRING_ONE.name()"ONE"이 아니라 "STRING_ONE"을 산출합니다. 이것은 단순히 좋은 대답이 아닙니다. 유효한 Java 식별자 등이 아닌 문자열을 가질 수 없습니다.
— Mark Peters

2
@Mark, true, 어떤 문자도 처리 할 수 ​​없습니다. OP가 단지 하나의 문자를 원한다면,이 솔루션은 Elite Gentleman 제안보다 더 간단합니다. 그러나 실제로 : 문자 범위가 유효한 Java 식별자가 가질 수있는 문자 범위를 초과하는 경우, 이것은 절대로 아닙니다. 좋은 지적.
— Bart Kiers

toString ()으로 표시하려는 것과 다른 열거 형에 대한 내부 명명 규칙을 갖는 것이 매우 합리적입니다 (특히 사용자가 출력을 보는 경우). 이것이 OP가 아니라고 생각하지 않습니다. 찾고있는.
— Michael McGowan

17
그 결과 name()는 난독 화 프로그램에 의해 영향을받을 수 있습니다. 얼마 전에 비슷한 문제가 발생했습니다. 예를 들어 Proguard를 사용하면이 문제를 해결해야합니다. Enumeration 클래스 처리
— noisecapella를

이것은 우수하다. var_name, var_superlong_but_not_toooooo_long_name 등과 같은 값으로 작동합니다 (삼점없이)

18

열거 형 이름을 원하는 문자열과 동일하게 설정하거나보다 일반적으로 임의의 속성을 열거 형 값과 연결할 수 있습니다.

enum Strings {
   STRING_ONE("ONE"), STRING_TWO("TWO");
   private final String stringValue;
   Strings(final String s) { stringValue = s; }
   public String toString() { return stringValue; }
   // further methods, attributes, etc.
}

상수는 맨 위에 있고 메소드는 속성을 맨 아래에 두는 것이 중요합니다.


또한 개인 생성자 가 있어야합니다 .
— Buhake Sindi

1
열거 형 생성자는 기본적으로 비공개이며 액세스 수정자가 필요하지 않습니다. 그러나 그것은 일반적으로 액세스 수정 자에 대한 좋은 지적입니다. 속성과 접근 자에 추가하기 위해 코드를 업데이트했습니다.
— Adrian Smith

15

"문자열로 사용"의 의미에 따라 여기에서 열거 형을 사용하지 않을 수 있습니다. 대부분의 경우, Elite Gentleman이 제안한 솔루션을 사용하면 in System.out.println(STRING_ONE)또는 to와 같은 toString 메소드를 통해 사용할 수 String s = "Hello "+STRING_TWO있지만 실제로 String (예 :)이 필요한 경우 STRING_ONE.toLowerCase()상수로 정의하는 것이 좋습니다.

public interface Strings{
  public static final String STRING_ONE = "ONE";
  public static final String STRING_TWO = "TWO";      
}

5
실제로 이것은 내가 피하려고하는 것입니다 ...!
— Dori

실제로, 그들이 toLowerCase()내 솔루션을 원한다면 갈 수 있습니다 Strings.STRING_TWO.toString().toLowerCase().
— Buhake Sindi

물론, 그것은 내가 해석 한대로 문자열로 사용하지 않습니다. Rrackham은 그 사용을 요구하지 않는 것처럼, 물론 제안 된 열거 형 솔루션을 사용해야합니다.
— hd42

6
생성자 interface가있는 final클래스 대신 사용하면 안됩니다 private. 낙심 한 연습입니다.
— Aleks N.

1
@mils, 열거 형을 사용하는 솔루션은 스위치에서도 작동합니다. 문자열이 직접 필요한 경우에만이 솔루션을 제안합니다.
— hd42

8

문자열 Enum에 사용할 수 있습니다

public enum EnumTest {
    NAME_ONE("Name 1"),
    NAME_TWO("Name 2");

    private final String name;

    /**
     * @param name
     */
    private EnumTest(final String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

그리고 주요 메소드에서 호출

public class Test {
    public static void main (String args[]){
        System.out.println(EnumTest.NAME_ONE.getName());
        System.out.println(EnumTest.NAME_TWO.getName());
    }
}

5

당신이 경우 하지 않습니다 사용할 생성자를 , 그리고 당신이해야 할 특별한 이름을 방법, 그것은이 시도 :

public enum MyType {
  ONE {
      public String getDescription() {
          return "this is one";
      }
  },    
  TWO {
      public String getDescription() {
          return "this is two";
      }
  };

  public abstract String getDescription();
}

이것이 가장 빠른 해결책 이라고 생각합니다 . final 변수 를 사용할 필요가 없습니다 .


그러나 이것으로 여전히 getDescription ()을 호출해야합니다.이 요청하는 사람은 하나를 호출하거나 상수로 액세스하려고합니다.
— kinsley kajiva

나는 이것을 선호한다. 더 많은 정보를 받아야 할 경우 어떻게됩니까? 이 솔루션을 사용하면 보호 된 추상 메소드를 추가하고 무시할 수 있습니다. toString () 메서드를 재정의 할 필요가 없습니다. 깨끗하고 최상의 답변으로 받아 들일 수 있습니다.
— Arundev

0

기본값으로 가져오고 설정하십시오.

public enum Status {

    STATUS_A("Status A"),  STATUS_B("Status B"),

    private String status;

    Status(String status) {
        this.status = status;
    }

    public String getStatus() {
        return status;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.