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


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.