2010-01-12 91 views
6

我有一個私有枚舉,不會暴露在類之外。無論如何,我可以做這種類型的靜態導入,所以我不必每次都鍵入枚舉類型?還是有更好的方法來寫這個?例如:我可以做一個私人子類的靜態導入嗎?

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 
    } 
} 

回答

3

或者有沒有更好的方法來寫這個?

如果你的主要目標是參考的項目沒有他們的排位賽枚舉標識,並私下維護這個列表,你可以完全取消的enum類型和使用普通的私有靜態常量。

+4

不,enum提供了其他形式的安全性,而不僅僅是封裝 - 例如,您可以在switch語句中使用它們,並且如果省略,則可以得到警告。只要堅持使用限定符 - 在java中有更糟糕的詳細問題;) – Chii 2010-01-12 12:06:20

+0

@akf:Chii的權利,在我的實際代碼中,枚舉具有超出靜態常量平凡的行爲。我只是簡化了所有這些問題,所以這只是最低限度的例子。我想我只是長期限定符名稱(比我的實際代碼中的「MyEnum」長得多,不幸...) – Kip 2010-01-12 14:41:17

+0

@Kip:在這種情況下,你爲什麼接受這個答案? – Thilo 2010-01-13 00:43:26

0

不,那幾乎就是private的全部。

+2

另一方面,外部類可以直接訪問所有私有字段和方法。所以這個情況可能會導致想要導入它。 – Thilo 2010-01-12 03:22:42

1

考慮到您可以訪問完全限定的字段,我會說它是編譯器(或語言規範)中的一個錯誤,您無法靜態導入它。

我建議你讓枚舉包保護。

0

您可以簡單地在枚舉本身內寫入代碼。

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 
} 
} 

其他地方的私人枚舉可以沒有自己的類引用是在switch語句:

private static enum MyEnum { 
    DOG, CAT 
} 

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

可以使用無修改訪問級別,即

enum MyEnum { DOG, CAT } 

MyEnum將不會從任何子類的其他包中看到。這是私密的最接近的形式,但讓你避免明確引用MyEnum

2

將某些代碼移動到枚舉的(靜態)方法中可能(或可能不會)合理。

如果按下,您可以複製外部類中的靜態字段。

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

伊奇,但一個可能性。

+0

是的,我也想到了這一點。我想這是要麼這只是使用合格的名稱。兩者都不是理想的,但我認爲使用合格的名稱至少不會出現錯誤。 – Kip 2010-01-12 14:42:24

相關問題