2010-01-12 85 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