问题描述
我查看了与此问题类似的 SO 上的各种问答,但没有找到解决方案.
I've looked at various Q&As on SO similar to this question but haven't found a solution.
我所拥有的是一个枚举,它代表查看电视指南的不同方式...
What I have is an enum which represents different ways to view a TV Guide...
在 NDroid Application 类中
In the NDroid Application class
static enum guideView { GUIDE_VIEW_SEVEN_DAY, GUIDE_VIEW_NOW_SHOWING, GUIDE_VIEW_ALL_TIMESLOTS }
...当用户更改视图时,事件处理程序从 0-2 接收 int,我想做这样的事情...
...when the user changes the view an event handler receives an int from 0-2 and I'd like to do something like this...
在 Android Activity onClick(DialogInterface dialog, int which) 事件处理程序
In an Android Activity onClick(DialogInterface dialog, int which) event handler
// 'which' is an int from 0-2 switch (which) { case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY: ... break; }
我已经习惯了 C# 枚举和 select/case 语句,它们允许像上面这样的事情,我知道 Java 做的事情不同,但我就是无法理解我需要做什么.
I'm used to C# enums and select/case statements which would allow something like the above and I know Java does things differently but I just can't make sense of what I need to do.
我将不得不求助于 if 语句吗?可能只有 3 个选择,所以我可以做到,但我想知道如何使用 Java 中的 switch-case 来完成.
Am I going to have to resort to if statements? There will likely only ever be 3 choices so I could do it but I wondered how it could be done with switch-case in Java.
编辑 抱歉,我没有完全扩展该问题,因为我将其视为通用 Java 问题.我已经添加到问题中以进一步解释.
EDIT Sorry I didn't completely expand on the issue as I was looking at it as being a generic Java issue. I've added to the question to explain a bit further.
没有任何特定于 Android 的东西,这就是为什么我没有将其标记为 Android,但枚举是在 Application 类中定义的,而我不想切换的代码在活动.枚举是静态的,因为我需要从多个活动中访问它.
There isn't anything that's Android specific which is why I didn't tag it as Android but the enum is defined in the Application class and the code where I wan't the switch is in an Activity. The enum is static as I need to access it from multiple Activities.
推荐答案
您缺少的部分是将整数转换为类型安全的枚举.Java 不会自动执行此操作.有几种方法可以解决这个问题:
The part you're missing is converting from the integer to the type-safe enum. Java will not do it automatically. There's a couple of ways you can go about this:
- 使用静态最终 int 列表而不是类型安全的枚举并打开您收到的 int 值(这是 Java 5 之前的方法)
- 打开指定的 id 值(如 heneryville 所述) 或枚举值的序数值;即 guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
判断int值代表的枚举值,然后开启枚举值.
- Use a list of static final ints rather than a type-safe enum and switch on the int value you receive (this is the pre-Java 5 approach)
- Switch on either a specified id value (as described by heneryville) or the ordinal value of the enum values; i.e. guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
Determine the enum value represented by the int value and then switch on the enum value.
enum GuideView { SEVEN_DAY, NOW_SHOWING, ALL_TIMESLOTS } // Working on the assumption that your int value is // the ordinal value of the items in your enum public void onClick(DialogInterface dialog, int which) { // do your own bounds checking GuideView whichView = GuideView.values()[which]; switch (whichView) { case SEVEN_DAY: ... break; case NOW_SHOWING: ... break; } }
您可能会发现编写自定义 valueOf 实现更有用/更不容易出错,该实现将整数值作为参数来解析适当的枚举值并让您集中检查边界.
You may find it more helpful / less error prone to write a custom valueOf implementation that takes your integer values as an argument to resolve the appropriate enum value and lets you centralize your bounds checking.