嵌套的Java枚举定义 - 声明为静态会有什么区别吗?

55

我有一个接口 - 这里是一个很好构思的例子:

public interface Particle {

    enum Charge {
        POSITIVE, NEGATIVE
    }

    Charge getCharge();

    double getMass();

    etc...
}

如果我将Charge枚举定义为静态的,那么实现的行为是否会有任何差异-即这是否会产生任何影响:

如果我将Charge枚举定义为静态的,那么实现的行为是否会有任何差异-即这是否会产生任何影响:

public interface Particle {

    static enum Charge {
        POSITIVE, NEGATIVE
    }

    Charge getCharge();

    double getMass();

    etc...
}
2个回答

88

不,这没有任何影响。然而,原因并不是因为它是接口内的成员声明,就像Jon所说的那样。真正的原因是根据语言规范 (8.9):

  

嵌套枚举类型是隐式静态的。可以将嵌套枚举类型明确声明为静态。

即使我们没有接口,在下面的示例中使用static也不会有任何区别:

public class A {
  enum E {A,B};
}

public class A {
  static enum E {A,B};
}

另一个例子是嵌套的私有 枚举(不是隐式公开)。

public class A {
  private static enum E {A,B}
}

3
我认为它是两者兼备——有两个不同的原因使其隐含地保持静态,但其中任何一个原因都足以让它保持静态。 - Jon Skeet

31

不,这没有任何区别。根据语言规范,第9.5节:

接口可以包含成员类型声明(§8.5)。接口中的成员类型声明是隐式的staticpublic


是的 (+1),实际上 Checkstyle 会将 'static' 标记为冗余,并要求您将其删除。接口和注释中的变量自动为 public、static 和 final,因此这些修饰符也是冗余的。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接