2013-07-15 40 views
14

Có thể triển khai toán tử ++ cho một điều kiện không?Có một toán tử gia tăng ++ cho Java enum không?

Tôi xử lý trạng thái hiện tại của state machine với enum và sẽ rất tuyệt khi có thể sử dụng toán tử ++.

+0

Nếu bạn đang nói về quá tải toán tử, không, điều này không thể thực hiện được với Java – BackSlash

+5

Vui lòng xem [câu trả lời này] (http://stackoverflow.com/a/17006263/18157). Lưu ý rằng ++ không thể có một đối tác trực tiếp cho enums vì hằng số enum là không thay đổi. Điều tốt nhất bạn có thể làm là định nghĩa một phương thức 'next()' trả về giá trị enum tiếp theo. –

+3

Đây là một so sánh gây hiểu lầm: hằng số nguyên là bất biến quá (trong đó '++' không thay đổi '5' nghĩa là gì), nhưng' ++ 'hoạt động tốt vì nó thay đổi * mà * số nguyên địa phương của bạn" đề cập đến " . '++' trên enums có thể làm điều tương tự, bằng cách thay đổi 'season' cục bộ để trỏ tới' SUMMER' thay vì 'SPRING'. – amalloy

Trả lời

37

Bạn không thể "tăng" một enum, nhưng bạn có thể nhận được tiếp theo enum:

// MyEnum e; 
MyEnum next = MyEnum.values()[e.ordinal() + 1]; 

Nhưng tốt hơn là để tạo ra một phương pháp dụ trên enum của bạn.

Lưu ý tốt như thế nào giá trị tiếp theo vấn đề được xử lý cho trường hợp enum cuối cùng, mà không có "bên cạnh" dụ:

public enum MyEnum { 

    Alpha, 
    Bravo, 
    Charlie { 
     @Override 
     public MyEnum next() { 
      return null; // see below for options for this line 
     }; 
    }; 

    public MyEnum next() { 
     // No bounds checking required here, because the last instance overrides 
     return values()[ordinal() + 1]; 
    } 
} 

Vì vậy, bạn có thể làm điều này:

// MyEnum e; 
e = e.next(); 

Các các lựa chọn hợp lý mà bạn có để thực hiện phương thức next() được ghi đè bao gồm:

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first

Trọng phương pháp tránh chi phí tiềm năng tạo ra các mảng values() để kiểm tra chiều dài của nó. Ví dụ, một thực hiện cho next() nơi dụ cuối cùng không override nó có thể là:

public MyEnum next() { 
    if (ordinal() == values().length - 1) 
     throw new NoSuchElementException(); 
    return values()[ordinal() + 1]; 
} 

Ở đây, cả hai ordinal()values() được (thường) gọi hai lần, mà sẽ chi phí nhiều hơn để thực hiện hơn phiên bản ghi đè ở trên.

+0

Bạn không thực sự cần tham số 'MyEnum' trong phương thức' next', phải không? –

+0

@MichaelLang damn - Tôi bắt đầu với một phương thức tĩnh rồi đổi nó thành một phương thức thể hiện, nhưng để lại tham số trong: (Thx. – Bohemian

+0

Câu trả lời của Jim Garrison (xem liên kết ở trên) gọi các giá trị() chỉ một lần - mỗi bản sao cuộc gọi Ngoài ra, nó xử lý incrementing qua cuối của điều tra, với các nhà điều hành modulus. –

4

No. Java không hỗ trợ quá tải toán tử tùy chỉnh cho bất kỳ loại do người dùng xác định nào, bao gồm cả enums.

Tuy nhiên, bạn có thể xác định phương thức trong lớp enum trả về điều tra tiếp theo.

Các vấn đề liên quan