为什么要使用静态枚举?

时间:2014-06-24 09:48:01

标签: java static enums

有时我在android中看到使用静态枚举。但我无法找到这些信息(我知道C语言中的枚举),

   public static enum brush{
        static{
          array[0] = brush1;
          array[1] = brush2;
          array[2] = brush3;
          array[3] = brush4;
    }
}

但是在项目中发生错误。错误信息是"语法错误,插入"标识符"完成EnumConstantHeader"但我不明白这是什么意思。

4 个答案:

答案 0 :(得分:10)

问题是这是一个没有成员列表的枚举。你通常有:

public enum Foo {
    VALUE1, VALUE2;
}

可以有一个没有成员的枚举,但你仍然需要分号:

public enum Foo {
    ;
}

现在有效,虽然不是非常有用。

枚举声明中的static部分可能是因为它嵌套在另一个类中。实际上并不需要这样做 - 嵌套的enum声明是隐式静态的。

static { ... }只是一个静态初始化程序,在初始化类型时运行。

Java中的枚举与C中的枚举完全不同。您应该阅读the enum section on the Java tutorial了解更多详情。

答案 1 :(得分:3)

您错过了}广告代码段中的static

public static enum brush{
    static{
      array[0] = brush1;
      array[1] = brush2;
      array[2] = brush3;
      array[3] = brush4;
    }
}

这里有几个代码味道:

  • 名称brush不符合命名约定:它应为Brush
  • array不是一个有意义的名字,如果我没记错的话,我认为它也是一个保留的名字。你应该选择一些告诉它功能的东西
  • brush1也没那么有意义
  • 我看不到array的声明

您最有可能尝试实现的目标是:

public static enum Brush{
    BRUSH_1, BRUSH_2, BRUSH_3, BRUSH_4;
}

答案 2 :(得分:2)

Java enum"是一种类型,其字段由一组固定的常量组成......只要你需要表示一组固定的常量,就应该使用枚举类型。"

Java Language Specification, Section 8.9:

中所述
  

枚举类型不得声明为抽象;这样做会导致一个   编译时错误。枚举类型是隐式最终的,除非它   包含至少一个具有类主体的枚举常量。它是一个   编译时错误,以明确声明枚举类型为final。   嵌套枚举类型是隐式静态的。允许   显式声明嵌套的枚举类型是静态的。这意味着   不可能定义本地枚举,或定义枚举   内心阶级。名为E的枚举类型的直接超类是Enum。   枚举类型没有除枚举之外的实例   常量。尝试显式是一个编译时错误   实例化枚举类型。

因为Java枚举类型适用于定义一组固定的常量,所以它通常用于表示Java程序中的常量:

  • 星期几
  • 一年中的几个月
  • 卡片中的卡片
  • 方向(北,南,东,西)
  • 菜单项选项
  • 定义命令行程序的参数
  • 美国各州(例如下拉列表)

典型示例:

1) 在名为Day的枚举中声明星期几。

public enum Day
{
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

2) 声明使用CSS时可以使用的边距类型:

/**
  * Corresponds to CSS margins.
  */
public enum Margin
{
  TOP, RIGHT, BOTTOM, LEFT
}

正如你所看到的,它没有任何价值,因为它们是常量,我们用全部大写字母命名它们,这与Java命名约定一致。

简单示例 -

public class JavaEnumToStringExample
{

  public static void main(String[] args)
  {
    // loop through the enum values, calling the
    // enum toString method for each enum constant
    for (Day d: Day.values())
    {
      System.out.println(d);
    }
  }
}

enum Day
{
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

输出 -

SUNDAY

MONDAY

TUESDAY

WEDNESDAY

THURSDAY

FRIDAY

SATURDAY

Enum成语 -

  • 因为它们是常量,所以创建了枚举字段的名称 大写(与其他Java常量一样)。
  • 您可以在需要表示固定的一组时使用枚举 常数。

答案 3 :(得分:0)

我认为这不是java中enum类型的正确实现。每当需要表示一组固定的常量时,都应该使用枚举类型。

语法:

access-modifier enum enum-name
 {
     enum_type_1,
         enum_type_2      //(optioanl semi colon)
 }

如果我们从中删除了enum关键字,那么enum会再次使用某些静态方法 静态方法。无法真正理解它背后的逻辑。可能您正在考虑在某些类中使用enum,但嵌套的枚举声明是隐式静态的。