2013-05-08 35 views
6

Có cách nào chuyển đổi một enum thành một biểu thức không đổi? Tôi muốn điều hành chuyển đổi của tôi để lựa chọn trong số các giá trị của một enum, nhưng tôi có một lỗi biên dịch "trường hợp biểu thức phải là biểu thức hằng số", vì vậy tôi đã cố gắng để khai báo nó trong một biến:Biểu thức không đổi từ một Enum

final int REG = MyEnum.REG.getIndex().intValue(); 

switch (service.getIndex()) { 

case REG: 

Nhưng tôi vẫn gặp lỗi tương tự. Theo tài liệu của Oracle http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

Một thời gian biên dịch biểu thức hằng số là một biểu thức biểu thị một giá trị kiểu nguyên thủy hoặc một String mà không hoàn thành đột ngột và là gồm chỉ sử dụng như sau:

• Literals thuộc loại nguyên thủy và chữ cái của loại Chuỗi

Vì vậy, nó không hoạt động vì tôi không sử dụng chữ. Tôi nghĩ rằng tôi sẽ phải khai báo nó là:

final int REG = 8; 

Nhưng tốt hơn nên liên kết nó với enum. Có cách nào để làm điều này không?

EDIT

Hóa ra tôi không cần phải sử dụng bất kỳ biến thức. Nó cũng đơn giản như:

switch (service) { 

case REG: 

Nó không xảy ra với tôi cho đến khi tôi thấy nhận xét của Andrea. Cảm ơn câu trả lời của bạn.

+1

tôi giả sử rằng 'service.getIndex()' lợi nhuận 'Integer ', đúng không? Bạn có thể sửa đổi nó để nó trả về enum của bạn? –

+1

Cho đến Java 1.6 bạn không thể sử dụng 'Chuỗi' trong' trường hợp chuyển đổi', nhưng bạn có thể sử dụng nó trong Java 7. FYI – Joshi

Trả lời

6

Nếu có thể, hãy sửa đổi phương thức getIndex() của bạn để nó trả về một enum thay vì số nguyên. Nếu đây là không thể, bạn cần phải đồ các chỉ số để một yếu tố enum:

Với enum sau:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

bạn có thể lập bản đồ chỉ số của bạn đến một yếu tố enum bằng cách sử dụng

Index.values()[index] 

Với phương pháp của bạn Integer getIndex(), sau đó bạn có thể làm điều gì đó như

switch(Index.values()[getIndex()]) 
    case ONE : ... 
     break; 

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

Lưu ý rằng điều này có thể ném một ArrayIndexOutOfBoundsException nếu bạn cố gắng truy cập vào chỉ mục trong enum lớn hơn số lượng thành phần enum (ví dụ: trong ví dụ trên, nếu getIndex() trả về một giá trị> 2).


tôi sẽ đóng gói các biểu hiện Index.values()[getIndex()] thành một phương pháp enum như valueOf(int index), tương tự như mặc định valueOf(String s). Sau đó bạn có thể xử lý kiểm tra chỉ mục mảng hợp lệ ở đó (và ví dụ trả về một giá trị enum đặc biệt nếu chỉ mục nằm ngoài phạm vi).Tương tự như vậy, bạn có thể sau đó cũng chuyển đổi các giá trị rời rạc mà có ý nghĩa đặc biệt:

public enum Index { 
    ZERO, 
    ONE, 
    TWO, 
    THREE, 
    REG, 
    INVALID; 


    public static Index valueOf(int index) { 

     if (index == 8) { 
      return REG; 
     } 

     if (index >= values().length) { 
      return INVALID; 
     } 

     return values()[index]; 
    } 
} 

Đây chỉ là một ví dụ - trong mọi trường hợp, nó thường phụ thuộc vào phạm vi của các giá trị bạn nhận được từ phương pháp getIndex() của bạn, và làm thế nào bạn muốn để ánh xạ chúng tới các phần tử enum.

Bạn có thể sau đó sử dụng nó như

switch(Index.valueOf(service.getIndex())) { 
    case ZERO : ... break; 
    ... 
    case REG : ... break; 
    ... 
} 

Xem thêm Cast Int to enum in Java đối với một số thông tin bổ sung (đặc biệt là gợi ý rằng values() là một hoạt động tốn kém vì nó cần phải trả lại một bản sao của mảng mỗi lần nó được gọi là).

+0

Nó làm việc cho tôi! Cảm ơn rất nhiều! – Mauker

2

Nếu bạn muốn các giá trị số cụ thể giao cho constacts enum đi như thế này

enum MyReg { 
    REG(8), OTHER(13); 

    public final int value; 
    MyReg(int value) { 
     this.value=value; 
    } 
} 

Sau đó bạn sử dụng nó như thế này:

class Test { 
    public static void main(String[] args) { 
     MyReg reg = MyReg.REG; 
     switch (reg) { 
     case OTHER: 
      System.out.println(reg.value); 
      break; 
     case REG: 
      System.out.println(reg.value); 
      break; 
     } 
    } 
} 
Các vấn đề liên quan