2010-01-12 27 views
6

Tôi có một enum là tư nhân, không được tiếp xúc bên ngoài lớp học. Có anyway tôi có thể làm một nhập khẩu tĩnh của loại đó, vì vậy mà tôi không phải gõ loại enum mỗi lần? Hay có cách nào tốt hơn để viết cái này? Ví dụ:Tôi có thể thực hiện nhập tĩnh của một lớp con riêng không?

package kip.test; 

import static kip.test.Test.MyEnum.*; //compile error 

public class Test 
{ 
    private static enum MyEnum { DOG, CAT } 

    public static void main (String [] args) 
    { 
    MyEnum dog = MyEnum.DOG; //this works but I don't want to type "MyEnum" 
    MyEnum cat = CAT; //compile error, but this is what I want to do 
    } 
} 

Trả lời

3

Hoặc có cách nào tốt hơn để viết nội dung này không?

Nếu mục tiêu chính của bạn là tham chiếu các mục mà không có số nhận dạng enum đủ điều kiện và duy trì danh sách này một cách riêng tư, bạn có thể loại bỏ hoàn toàn loại enum và sử dụng hằng số tĩnh riêng thông thường.

+4

không, enum cung cấp các hình thức an toàn khác ngoài việc đóng gói - ví dụ, bạn có thể sử dụng chúng trong báo cáo chuyển đổi và bạn có thể nhận được cảnh báo nếu bạn bỏ qua một. Chỉ cần gắn bó với vòng loại - có vấn đề về độ dài trong java;) – Chii

+0

@akf: Quyền của Chii, trong mã thực sự của tôi, enums có một số hành vi vượt quá những gì có thể được thực hiện một cách trivially với hằng số tĩnh. Tôi chỉ đơn giản hóa tất cả những điều đó cho câu hỏi vì vậy nó sẽ là ví dụ tối thiểu. Tôi đoán tôi chỉ bị mắc kẹt với tên vòng loại dài (lâu hơn "MyEnum'" trong mã thực sự của tôi không may ...) – Kip

+0

@Kip: trong trường hợp này, tại sao bạn chấp nhận câu trả lời này? – Thilo

0

Nope, đó là khá nhiều những gì private là tất cả về.

+2

Mặt khác, lớp bên ngoài có thể truy cập trực tiếp tất cả các trường và phương thức riêng tư. Vì vậy, trường hợp có thể được thực hiện cho muốn nhập khẩu nó. – Thilo

1

Xem xét rằng bạn có thể truy cập vào trường đầy đủ điều kiện, tôi sẽ nói rằng đó là lỗi trong trình biên dịch (hoặc đặc tả ngôn ngữ) mà bạn không thể nhập tĩnh nó.

Tôi đề nghị bạn nên bảo vệ gói liệt kê.

0

Bạn có thể chỉ cần viết mã bên trong chính enum.

public enum MyEnum { 
DOG, CAT; 
public static void main(String[] args) { 
    MyEnum dog = MyEnum.DOG; // this works but I don't want to have to type 
           // MyEnum 
    MyEnum cat = CAT; // compile error, but this is what I want to do 
} 
} 

Các nơi khác, nơi enums tư nhân có thể được tham chiếu mà không lớp học của họ đang ở trong một câu lệnh switch:

private static enum MyEnum { 
    DOG, CAT 
} 

public static void main(String[] args) { 
    MyEnum e = null; 
    switch (e) { 
    case DOG: 
    case CAT: 
    } 
} 
4

Bạn có thể sử dụng cấp độ truy cập không sửa đổi, tức là

enum MyEnum { DOG, CAT } 

MyEnum sẽ không hiển thị đối với các lớp từ các gói khác, không phải từ bất kỳ lớp con nào. Đây là hình thức riêng tư gần nhất, nhưng cho phép bạn tránh tham chiếu rõ ràng MyEnum.

2

Có thể (hoặc có thể không) là hợp lý để di chuyển một số mã vào (tĩnh) phương pháp của enum.

Nếu được nhấn, bạn có thể sao chép các trường tĩnh trong lớp bên ngoài.

private static final MyEnum CAT = MyEnum.CAT; 
private static final MyEnum DOG = MyEnum.DOG; 

Rất tiếc, nhưng có thể xảy ra.

+0

Vâng tôi cũng nghĩ về điều này. Tôi đoán nó hoặc là điều này hoặc chỉ sử dụng tên đủ điều kiện. Không lý tưởng, nhưng tôi nghĩ việc sử dụng tên đủ điều kiện sẽ ít bị lỗi hơn. – Kip

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