enum 값을 int로 변환하는 방법?


240

int 형식을 반환하는 함수가 있습니다. 그러나 TAX 열거 값만 있습니다.

TAX 열거 형 값을 int로 캐스팅하려면 어떻게해야합니까?

public enum TAX {
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);

    private int value;
    private TAX(int value){
        this.value = value;
    }
}

TAX var = TAX.NOTAX; // This value will differ

public int getTaxValue()
{
  // what do do here?
  // return (int)var;
}

1
의 가능한 중복 열거 형 INT 일치하는 방법
MALAT

답변:


354

열거 형을 value어떻게 든 노출시켜야합니다.

public enum Tax {
    NONE(0), SALES(10), IMPORT(5);

    private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

...

public int getTaxValue() {
    Tax tax = Tax.NONE; // Or whatever
    return tax.getValue();
}

(나는 이름을 조금 더 전통적이고 읽기 쉬운 것으로 바꿨다.)

이되는 가정 생성자에 할당 된 값을합니다. 그것이 당신이 원하는 것이 아니라면, 우리에게 더 많은 정보를 제공해야합니다.


1
@likejiujitsu : 반대 방향으로 가고 있습니다. 이 질문에서 OP는 이미 type 값을 가지며Tax 숫자 값을 가져 오려고합니다.
Jon Skeet

방금 시도해보고 myEnumValue = MyEnum.valueOf(myInt);arg가 String 유형이어야 한다는 것을 깨달았습니다. 또는 내가 누락 된 것이 있습니까?
likejudo

이 솔루션은 아무것도 아닌 것보다 나쁩니다. Java의 열거 형을 사용해서는 안됩니까? 아니면 JDK 1.8이 그것을 바 꾸었습니까?
ebyrob 2016

@ ebyrob : 투표를하면 많은 사람들이 당신처럼 동의하지 않는 것 같습니다. 고정 된 값 세트를 원하면 열거 형이 좋습니다.
Jon Skeet

209

나는 이것을 선호한다 :

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

그때:

//cast enum to int
int color = Color.Blue.ordinal();

34
Joshua Bloch가 그의 책 Effective Java (2nd ed)에서 올바르지 않거나 권장하지 않습니다. 항목 31을 참조하십시오.
user504342

43
@ user504342이 책의 제 2 판이 없으므로 권장하지 않는 이유를 알려주시겠습니까?
likejudo

17
두 가지 이유 : 하나는 새로운 상수가 추가되면 서수 값과 상수 사이의 연결이 끊어지고 두 가지 API 문서가 특별히 권장하지 않습니다.
jordanpg

8
깨끗하고 완벽합니다. 나는 "하지 마십시오"와 "권장하지 않는"몇 가지를 봅니다. 왜 그것이 나쁜 것으로 간주되는지 연구해야 할 것입니다. 부풀어 오른 샘플 중 일부는 나쁜 IMO로 보입니다. 그런 간단한 일을하기 위해 많은 노력을 기울입니다.
Herb Meehan

4
한 팀에서는 공동 개발자가 중간에 값을 추가하거나 (처음에는 더 나빠질 것) 아무 조치도 취하지 않고 정렬하여 코드를 완전히 엉망으로 .ordinal()
만들 것이라고 확신합니다

18

생성자에 할당하려는 값을 원하면 열거 형 정의에 해당 값을 반환하는 메서드를 추가해야합니다.

열거 형 값을 나타내는 고유 번호를 원하면을 사용할 수 있습니다 ordinal().


2
조심해. 에 대한 ordinal()유효한 사용 사례보다 더 많은 개발 반 패턴이 있습니다 ordinal(). 에 대해 고유 한 값을 저장해야하는 enum경우을 저장하십시오 enum. EnumSets, Enums List, EnumMaps 및 사용 가능한 거의 모든 Enum 컬렉션이 있습니다.
Edwin Buck

1
@ EdwinBuck : 지적하기에 좋았습니다 .OP ordinal()가 실제로 그가 원하는 것을 명확하게하지 못했기 때문에 그 존재를 언급하고 싶었습니다.
unholysampler

서수를 구하지 마십시오. 이에 관한 열거 API를 확인하십시오. 상향 투표가 제거되었습니다.
호버크라프트 가득한 뱀장어

3
ordinal()열거 형 자체 에서 내부적으로 사용하는 것에 대한 사람들의 생각이 무엇인지 궁금 합니다. 예를 들어, 내가 "라는 열거 형이 있다고 가정 Season값을 포함" Spring, Summer, Autumn, 그리고 Winter, 그것이라는 공공 방법있다 next()반환 values()[(ordinal() + 1) % 4] , 어떤 코드는 지금까지, 서수를 외부에서 볼 수 없습니다 및이 열거에 추가 멤버가 없을 것 유효한 유스 케이스처럼 보입니다.
Darrel Hoffman

1
@DarrelHoffman 내 ordinal()열거 형 열거 상수의 변경으로 인해 멀리 떨어진 코드에서 힌지를 사용하는 것에 대해 볼 수있는 유일한 강력한 주장 때문에 내 기분이 좋습니다 . 열거 형 상수를 수정하려면 이미 해당 파일에 있어야합니다. 대부분의 열거 형은 상당히 짧으며 그렇지 않은 경우 어쨌든 파일을 더 철저하게 확인해야합니다. 두 경우 모두 next()어쨌든 방법을 다루는 단위 테스트가 있어야 합니다.
Alan Hensley 2016 년

12

언젠가는 C # 접근 방식이 Java 세상에서 삶을 더 쉽게 만듭니다 .. :

class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK;

나에게 이것은 가장 바람직한 방법입니다. DB 친화적 인 데이터 형식 인 enum (코드 명확성)의 이점을 얻었으며이를 "android way"로하기 위해 100 가지 enum 대안을 연구 할 필요가 없습니다. 간단하고 효과적입니다.
John Ward

좋은. 마치 자바 열거 형이 열거 형이 사용되는 현실과 완전히 분리 된 것처럼 ... 특히 사람들이 싱글 톤과 같은 것들을 위해 그것을 학대하기 시작하는 경우와 같습니다. 이 방법은 모든 가치를 얻는 쉬운 방법이 없다는 단점이 있습니다.
Nyerguds

이것은 열거 형 값을 메소드에 전달하려고 시도하는 단점이 있습니까? 더 이상 XLINK를 메소드에 전달할 수 없습니다. 메소드를 구체적으로 나타내지 않기 때문입니다. 당신은 당신의 방법으로 입력을 잃게됩니다. 메소드 서명은 XLINK 대신 짧게 읽어야합니다.
더스틴 젠슨

2

열거 형에 값을 추가하면 문자열이 여전히 유효하기 때문에 정수보다 문자열 표현을 사용하는 것이 좋습니다. 열거 형의 name () 메소드를 사용하여 열거 형 값을 문자열로 변환하고 열거 형의 valueOf () 메소드를 사용하여 문자열에서 열거 형 표현을 다시 작성할 수 있습니다. 다음 예제는 열거 형 값을 문자열로 변환하는 방법을 보여줍니다 (ValueType은 열거 형임).

ValueType expected = ValueType.FLOAT;
String value = expected.name();

System.out.println("Name value: " + value);

ValueType actual = ValueType.valueOf(value);

if(expected.equals(actual)) System.out.println("Values are equal");

1
public enum Tax {

NONE(1), SALES(2), IMPORT(3);

private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public String toString() {
        return Integer.toString(value);
    }
}

class Test {
    System.out.println(Tax.NONE);    //Just an example.
}

0

다소 다른 접근법 (적어도 안드로이드에서는)은 IntDef 주석을 사용하여 일련의 int 상수를 결합하는 것입니다

@IntDef({NOTAX, SALESTAX, IMPORTEDTAX})
@interface TAX {}
int NOTAX = 0;
int SALESTAX = 10;
int IMPORTEDTAX = 5;

함수 매개 변수로 사용하십시오.

void computeTax(@TAX int taxPercentage){...} 

또는 변수 선언에서 :

@TAX int currentTax = IMPORTEDTAX;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.