枚举不能用于固定常数?

时间:2013-04-20 15:29:10

标签: java enums

我使用以下来定义固定的常量集

private enum MENU_OPTIONS {
   MENU_SEND_SMS,
   MENU_COPY_SMS,
   MENU_ADD_SMS,
   MENU_POST_FACEBOOK,
   MENU_TWEET
}

我有一个接受INT的方法

menu.add (int, int, int, String);

所以当我向上述方法提供“MENU_OPTIONS.MENU_SEND_SMS”时,报告错误

menu.add(0, MENU_SEND_SMS, 0, ); // error: The method add(int, int, int, CharSequence) in the type Menu is not applicable for the arguments (int, FavoriteSMSFragment.MENU_OPTIONS, int, String)

所以如果我想使用一组固定的常量,我该如何定义ENUM?

4 个答案:

答案 0 :(得分:3)

枚举是一个类。 MENU_OPTIONS.MENU_SEND_SMS的类型为MENU_OPTIONS(因为它是表示单个菜单选项的类,因此应命名为MenuOption)。

因此,add()方法应采用MenuOption类型的参数,而不是int类型的参数。这样更安全,因为它记录了方法所期望的内容(int比MenuOption更模糊),并且因为除了枚举中定义的值之外你将无法传递任何值(而任何无效的int值都可能是传递给一个以int作为参数的方法。

答案 1 :(得分:2)

java中的枚举与C或C ++中的枚举不同。它们基本上归结为类的静态实例。 This article explains it well and with examples。我相信你现在的方式需要MENU_SEND_SMS.ordinal(),但你可以通过使用枚举作为一个类来做得更好(就像我链接的文档中的例子一样)

答案 2 :(得分:1)

System.out.println(MENU_OPTIONS.MENU_ADD_SMS); 

它会打印 MENU_ADD_SMS (类型为MENU_OPTIONS

您可能希望使用 ordinal() ENUM获取int值:

System.out.println(MENU_OPTIONS.MENU_ADD_SMS.ordinal());

现在它将打印 2 ,作为方法除外。

或者,在所有情况下,您可以更改方法,使其接受MENU_OPTION而不是int

答案 3 :(得分:0)

在Java中,枚举更像是类的命名实例。enum类型是一种特殊的数据类型,它使变量成为一组预定义的常量。 MENU_SEND_SMS的类型为MENU_OPTIONS。它不是原始int类型。它不像{C}在其他语言中使用的方式那样工作。

你可以做三件事:

1)更改参数类型

enums

2)如果您仍然支持现有的方法定义:

menu.add (int, MENU_OPTIONS, int, String);

然后调用:

menu.add (int, int, int, String);

3)将枚举定义为:

MENU_OPTIONS option = MENU_OPTIONS.MENU_SEND_SMS
menu.add(0, option.ordinal(), 0, "someString");

并将其用作:

public enum MENU_OPTIONS {
      MENU_SEND_SMS(0),
      MENU_COPY_SMS(1),
      MENU_ADD_SMS(2),
      MENU_POST_FACEBOOK(3),
      MENU_TWEET(4);

     private final int option;
     private MENU_OPTIONS (int option) {
        this.option= option;
     }

     public int getOption() {
        return option;
    }
 }