如果我在常量中创建public方法并没有此方法而将枚举留为空白,为什么没有任何错误?在这种情况下,我刚刚定义的方法根本无法调用。还是我错了?
实际上,编译器应该能够看到该方法在枚举常量的类主体之外不可见,并警告您是否未使用该方法-我确信Eclipse会这样做。正如
dasblinkenlight指出的那样,这样的公共方法实际上可能是枚举实现的接口所声明的方法的替代。
[…]我刚刚定义的方法根本无法调用。还是我错了?
正确,您错了:Javaenum可以实现接口,如下所示:
interface Bar { void myMethod();}enum Foo implements Bar { VALUE_1 { public void myMethod() { System.err.println("val1"); } };}现在您可以访问myMethodinside了VALUE_1。当然,您将不得不以其他值或enum本身来实现此方法。此外,您始终可以通过反射来访问语言无法访问的方法。
就公共变量而言,似乎反射是这里的唯一方法。尽管如此,没有理由完全禁止此操作(尽管很难想象有一个有用的应用程序可供使用)。
您在某处使用过这种功能吗?
我确实使用了enum实现接口的,每个常量都以其特定方式实现接口的方法。
我只是不明白,为什么可以定义不可达的方法。我能想到的唯一原因是程序员正在工作并且还没有接口的定义。因此,他只是准备单个方法的代码,稍后将添加“
implements”关键字。除了这是不合逻辑的,它仍然需要在所有常量中都使用这种方法。
如前所述,这不适用于枚举常量类。范围很广-私有嵌套类,本地类,匿名类-成员公开是毫无意义的。
这个问题的问题在于只有语言设计师才能真正回答它。我只能给出我的意见,那就是:为什么要出错?语言规范不是免费提供的-
必须精心定义JLS中的所有内容,然后实施和测试。真正的问题是,使它成为错误有什么好处?唯一的事实是,尽管一个未使用的成员可能表示一个错误(因此发出警告),但它没有任何
伤害 。
如果在常量内创建公共变量(或更精确地说,字段),为什么没有任何错误?在任何情况下(从外部)都无法访问它。因此,修饰符“
public”在这里没有任何意义。
与上面相同-
如果未使用变量,则编译器或至少某些IDE会警告您。这与您
public在
private嵌套类中声明变量然后没有在任何地方引用它相同。在任何情况下,禁止JLS优先考虑禁止这种情况,尽管反射的眼睛可以看到一切。
除了可见性修饰符在这里完全没有用处之外,它与上一点更没有相同之处。它是公共的,受保护的还是私有的都没关系,因为您无论如何都无法访问它。我认为这是一个错误。
在这里,您忘记了成员可能仍会在枚举常量类主体中使用-例如考虑一个辅助方法。只是在这种情况下,访问修饰符无关紧要,可以忽略。
为什么可以定义一个类(没有可见性修饰符),但是不能定义接口呢?是的,您可能不想编写如此残酷的枚举,以至于需要在常量内定义类,甚至在该常量内使用继承。但是,如果可以定义类和抽象类,这似乎并不奇怪。
这是一个很好的问题,我花了一段时间了解您的意思。为了澄清,您是说在这种情况下仅允许该类:
VALUE_1 { class Bar { } interface Baz { }},为了阐明这一点,请尝试上课
static:
VALUE_1 { static class Bar { } interface Baz { }},现在都不允许。为什么?
static枚举常量主体中不能声明任何内容,因为该主体处于该常量 实例 的上下文中。这类似于在内部(非静态嵌套)类的范围内:
class Outer { class Inner { // nothing static allowed here either! }}在这种范围内,静态变量,方法,类和 接口 (嵌套时隐式静态)都是禁止的。
您在某处使用过这种功能吗?我可以想象它可能有用,但是一点也不令人困惑。另外,当我搜索有关此的一些资源时,我什么也没找到。
目前尚不清楚您在此指的是什么功能。请更新问题以指定您要查找的内容-枚举常量类主体中的重写方法?田野?辅助方法?助手班?请澄清。



