枚举和变量的名称相同

时间:2011-10-23 20:34:30

标签: java

我有以下代码(我知道它不好;)):

public class Clazz1 {

    public int test = 10;

    public enum test {a, s, d, f  }

    void sth() {
        // ...  
        }
}

有没有办法访问这个枚举?当我输入'test'时,它总是意味着int变量。什么是与这种情况相关的规则 - 为什么甚至编译器都允许使用相同名称的枚举和int?

4 个答案:

答案 0 :(得分:4)

public class Clazz1 {

    public int test = 10;

    public enum test {a, s, d, f };

    public static void main() {
        System.out.println("a: " + Clazz1.test.a);
    }
}

何时运行

$ javac Clazz1.java 
Clazz1.java:8: error: non-static variable test cannot be referenced from a static context
    System.out.println("a: " + Clazz1.test.a);
                                     ^
Clazz1.java:8: error: int cannot be dereferenced
    System.out.println("a: " + Clazz1.test.a);
                                          ^

枚举实际上是特殊的类类型,使用enum关键字会导致创建类。例如:

import java.util.Arrays;
import static java.lang.System.out;

public class Clazz1 {

    public enum test
    {
    a, b, c, d, e, f;
    };

    public static int test = 10;


    public static void main(String[] args) {
    Class<?> ec = Clazz1.test.class;
    out.format("Name: %s, constants: %s%n\n", ec.getName(), 
        Arrays.asList(ec.getEnumConstants()));
    }
}

您现在可以使用ec和Enum类方法来获取实体。问题是你真的不想这样做。因为它相当于:

class Foo {
       class Bar { }
       int Bar;
}

这将使javac吐出不必要的墓志铭。

有关Enum反射类的更多信息,请查看java api文档

答案 1 :(得分:3)

访问test枚举的静态成员应该仍然有效,枚举常量是静态成员。试试Clazz1.test.a

更新:不,它不起作用(见评论),所以你需要诉诸这样的肮脏技巧:

// this works but is awful not compile-time-safe
test a = Clazz1.test.class.getEnumConstants()[0];  

但是存在Java variable naming conventions存在的原因:使这种情况不太可能发生,Java代码更具可读性:

  • 枚举名称(与其他类和接口名称一样)应位于UpperCamelCase
  • 局部变量名和字段名应该在lowerCamelCase
  • 常量(静态和最终字段)应该在UPPER_UNDERSCORE_CASE中。

答案 2 :(得分:1)

变量和类型名称位于不同的名称空间中:

String String = "Hello!";

不确定你的意思“它总是意味着int变量”。 编辑啊,我明白你的意思了;肖恩的答案解决了如何界定名称的范围。

答案 3 :(得分:1)

这个例子实际上有点像把汽车撞到一堵墙上,并试图通过观察哪些部件首先落在一起来弄清楚发动机是如何工作的。

我真的建议:

  • 用不同的名称区分不同的变量

  • 在路上开车;不要把它撞到墙上

恕我直言: - )

PS: 答案是“命名空间”。您可以在Java语言规范中查找: - )