2011-11-16 27 views
177

Tôi có một hàm trả về kiểu int. Tuy nhiên, tôi chỉ có một giá trị của việc liệt kê TAX.Làm thế nào để chuyển đổi giá trị enum thành int?

Tôi làm cách nào để truyền giá trị điều tra TAX thành 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

Có thể trùng lặp của [Cách khớp với enum] (http://stackoverflow.com/questions/7996335/how-to-match-int-to-enum) – malat

Trả lời

273

Bạn cần làm cho enum lộ value bằng cách nào đó, ví dụ:

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(); 
} 

(Tôi đã thay đổi tên để có một chút truyền thống hơn và có thể đọc được, btw.)

Đây là giả bạn muốn giá trị giao trong constructor. Nếu đó không phải là điều bạn muốn, bạn sẽ cần cung cấp thêm thông tin cho chúng tôi.

+11

có một ý tưởng tốt hơn ở đây http://stackoverflow.com/a/7996473/398348 – likejiujitsu

+0

@likejiujitsu: Điều đó đi theo hướng ngược lại. Trong câu hỏi này, OP đã * có * một giá trị kiểu 'Tax', và muốn lấy giá trị số từ nó. –

+0

Tôi chỉ thử nó và nhận ra nó không thành công 'myEnumValue = MyEnum.valueOf (myInt);' arg phải là kiểu String - hoặc có cái gì đó tôi đang thiếu? – likejiujitsu

16

Nếu bạn muốn giá trị bạn chỉ định trong hàm tạo, bạn cần thêm phương thức trong định nghĩa enum để trả về giá trị đó.

Nếu bạn muốn một số duy nhất đại diện cho giá trị enum, bạn có thể sử dụng ordinal().

+2

Hãy cẩn thận. Có nhiều mẫu anti-patterns phát triển dựa trên 'ordinal()' hơn các trường hợp sử dụng hợp lệ cho 'ordinal()'. Nếu bạn cần lưu trữ một giá trị duy nhất cho 'enum', thì chỉ cần lưu trữ' enum'. Có EnumSets, List of Enums, EnumMaps và gần như bất kỳ bộ sưu tập Enum nào khác mà bạn có thể muốn có sẵn. –

+1

@EdwinBuck: Điều đó là tốt để chỉ ra, tôi chỉ muốn đề cập đến sự tồn tại của 'ordinal()' bởi vì OP không làm cho nó rõ ràng những gì ông muốn int thực sự được. – unholysampler

+0

Không nhận được thứ tự. Vui lòng kiểm tra enum api về việc này. Bỏ phiếu bầu đã bị xóa. –

161

tôi thích điều này:

public enum Color { 

    White, 

    Green, 

    Blue, 

    Purple, 

    Orange, 

    Red 
} 

thì:

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

Điều này là không chính xác/không được đề xuất bởi Joshua Bloch trong cuốn sách Effective Java (2nd ed). Xem mục 31. – user504342

+1

Sử dụng phương thức ordinal() trực tiếp không được khuyến khích. – tonga

+25

@ user504342 Tôi không có ấn bản thứ 2 của cuốn sách để bạn có thể vui lòng cho chúng tôi biết lý do tại sao nó không được khuyến nghị? – likejiujitsu

6

Đôi khi một số C# phương pháp làm cho cuộc sống dễ dàng hơn trong thế giới 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; 
+0

Đối với tôi, đây là cách dễ nhất để đi. Tôi nhận được những lợi ích của enum (mã rõ ràng), một loại dữ liệu đó là DB thân thiện, và tôi không phải nghiên cứu 100 enum lựa chọn thay thế để làm điều đó "cách android". Đơn giản và hiệu quả. –

1

Có lẽ nó tốt hơn để sử dụng một chuỗi đại diện hơn một số nguyên, bởi vì Chuỗi vẫn hợp lệ nếu các giá trị được thêm vào enum. Bạn có thể sử dụng phương thức name() của enum để chuyển đổi giá trị enum thành một String một phương thức valueOf() của enum để tạo ra một biểu diễn enum từ String một lần nữa. Ví dụ sau cho thấy cách chuyển đổi giá trị enum thành String và ngược lại (ValueType là một enum):

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"); 
Các vấn đề liên quan