2013-04-20 78 views
0

我使用以下来定义组固定的常量枚举不能用于固定常量?

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

和I具有接受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?

回答

0

在Java中,枚举更像是一个类的命名实例。enum类型是一种特殊的数据类型,它使变量成为一组预定义的常量。 MENU_SEND_SMSMENU_OPTIONS的类型。这是原始int type.It不不起作用enums在其他语言中使用类似C的方式

三件事可以做:

1)更改参数的类型

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

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

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

然后在voke为:

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

3)定义枚举为:

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; 
    } 
} 

而且使用它作为:

menu.add(0, MENU_OPTIONS.MENU_SEND_SMS.getOption(), 0, "someString"); 
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());

现在,它会打印,所不同的方法。

或者,一般地,您可以更改该方法,以便它接受MENU_OPTION而不是int

3

enum是一个类。 MENU_OPTIONS.MENU_SEND_SMS的类型为MENU_OPTIONS(因为它是代表单个菜单选项的类,应该命名为MenuOption)。从而

add()方法应该采取MenuOption类型和不int类型的参数的参数。这更安全一些,因为它记录了方法期望的结果(int比MenuOption更加模糊),并且因为除了枚举中定义的值之外,您将无法传递任何值(而任何无效的int值都可能是传递给以int为参数的方法)。

2

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

+0

+1 for ordinal ) – A4L 2013-04-20 15:39:07