2011-12-12 35 views
28

Nếu tôi có một lớp trong Java như thế này:Sử dụng Java enums từ các lớp khác nhau?

public class Test 
{ 
    // ... 
    public enum Status { 
     Opened, 
     Closed, 
     Waiting 
    } 
    // ... 
} 

Và tôi đã có một lớp khác nhau trong một tập tin lớp khác nhau (nhưng trong cùng một dự án/thư mục):

public class UsingEnums 
{ 
    public static void Main(String[] args) 
    { 
     Test test = new Test(); // new Test object (storing enum) 

     switch(test.getStatus()) // returns the current status 
     { 
      case Status.Opened: 
       // do something 
      // break and other cases 
     } 
    } 
} 

tôi sẽ có hiệu quả có một enum trong một lớp được sử dụng trong lớp khác (trong trường hợp của tôi, cụ thể trong một tuyên bố chuyển đổi trường hợp).

Tuy nhiên, khi tôi làm điều đó, tôi nhận được một lỗi như:

không thể tìm thấy biểu tượng - lớp Status

Làm thế nào tôi sẽ khắc phục điều đó?

+2

Tất cả các câu trả lời có vẻ đúng, nhưng khi tôi làm điều đó, nó bắt đầu đưa ra lỗi 'nhãn trường hợp chuyển đổi enum phải là tên không đủ tiêu chuẩn của hằng số liệt kê' và tôi thấy rằng chỉ cần xóa mọi thứ ở phía trước trạng thái ('Status.Opened' trở thành' Opened') nó đã sửa nó. – Bhaxy

Trả lời

77

Một switch enum nhãn trường hợp phải là không đủ tiêu chuẩn tên của một hằng số enum:

switch (test.getStatus()) // returns the current status 
{ 
    case Opened: 
     // do something 
     // break and other cases 
} 

Nó không quan trọng rằng nó được định nghĩa trong một lớp khác. Trong mọi trường hợp, trình biên dịch có thể suy ra loại của enum dựa trên câu lệnh switch của bạn và không cần tên không đổi để đủ điều kiện. Vì bất kỳ lý do gì, việc sử dụng tên đủ điều kiện là cú pháp không hợp lệ.

Yêu cầu này được xác định bởi JLS §14.11:

SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

(Cảm ơn Mark Peters' related post cho tham khảo.)

+4

Bỏ phiếu - Tôi đã học được điều gì đó mới mẻ hôm nay ... –

+1

@AmirAfghani - Tôi gần như đã đi cùng một lộ trình, nếu bạn nhìn vào lịch sử chỉnh sửa của tôi :) May mắn là tôi đã thử nghiệm và nhớ về enums. –

+1

Do sự tích cực * làm * trả hết;) –

2

NVM

Nó cần phải được hoàn toàn không đủ tiêu chuẩn, trình độ chuyên môn được đưa ra bởi các loại biến switch() ed (trong trường hợp này test.getStatus(), mà là một Test.Status).


bạn Enum Status là một phần của class Test của bạn. Như vậy, bạn cần phải hội đủ điều kiện đó:

Test test = new Test(); // new Test object (storing enum) 

    switch(test.getStatus()) // returns the current status 
    { 
     case Test.Status.Opened: 
      // do something 
     // break and other cases 
    } 

2

Như enum Status được kèm theo trong lớp Test bạn cần phải sử dụng Test.Status thay của chỉ Status.

1

Enums là (nhiều hơn hoặc ít hơn) chỉ là các lớp giống như bất kỳ trường nào khác, vì vậy các quy tắc ở đây giống như đối với các lớp bên trong khác. Ở đây, bạn có thể muốn khai báo lớp enum là static: nó không phụ thuộc vào các thành viên của lớp kèm theo của nó. Trong trường hợp đó, Test.Status.Opened sẽ là một cách chính xác để tham khảo. Nếu bạn thực sự không có nghĩa là lớp đó là tĩnh, bạn có thể cần phải sử dụng một cá thể làm vòng loại "không gian tên", tức là test.Status.Opened.

Chỉnh sửa: Rõ ràng enums là hoàn toàn tĩnh. Điều này làm cho một số ý nghĩa cho những gì một enum được cho là, nhưng nó có thể là hình thức tốt để tuyên bố chúng là tĩnh một cách rõ ràng.

10

Nếu getStatus() lợi nhuận của bạn trong thực tế, một Status trường hợp của bạn nên là:

case Opened: 

Nếu bạn cố gắng:

case Test.Status.Opened: 

IDE của bạn sẽ cung cấp cho bạn một lỗi như:

an enum switch case label must be the unqualified name of an enumeration constant 
0

Hãy thử với ví dụ này

switch(test.getStatus()) { 

    case FILE : 
      fullList.addAll(getFileMensionList(session, search, authUser)); 
      break; 
    case EVENT : 
      fullList.addAll(getEventMensionList(session, search, authUser)); 
      break; 
    case POLL : 
      fullList.addAll(getPollMensionList(session, search, authUser)); 
      break; 
    case PROJECT : 
      fullList.addAll(getProjectMensionList(session, search, authUser)); 
      break; 
    case TASK : 
      fullList.addAll(getTaskMensionList(session, search, authUser)); 
      break; 
} 
1

tôi đã tuyên bố một enum trong lớp của tôi như sau:

public class MyBinaryTree {

private Node root; 
public enum ORDER_TYPE { 
    IN_ORDER, POST_ORDER, 
}; 

    public void printTree(ORDER_TYPE order) { 
    //Printing tree here 
    } 

}

và tôi đã cố gắng truy cập này trong một lớp học khác nhau

Lớp công khai Solution1 {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    MyBinaryTree myTree = new MyBinaryTree(); 
      myTree.printTree(myTree.ORDER_TYPE.POST_ORDER); 
    } 

}

Vấn đề ở đây là nếu tôi sử dụng một đối tượng dụ để truy cập ORDER_TYPE enum tôi nhận được một lỗi thời gian biên dịch: "ORDER_TYPE không thể được giải quyết hay không là một lĩnh vực"

Tôi đã kiểm tra một lần nữa và thay đổi mã của tôi để trực tiếp sử dụng tên lớp như tên vòng loại

public static void main(String[] args) { 
MyBinaryTree myTree = new MyBinaryTree(); 
myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER); 
} 

này giải quyết vấn đề - tôi tin rằng bất cứ khi nào chúng ta đang sử dụng enum của một lớp trong khác - chúng ta nên truy cập nó thông qua Clas s như một phương pháp tĩnh.

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