Java使用enum与switch语句
我已经看过类似于这个问题的各种问答,但还没有find解决办法。
我所拥有的是一个枚举,它代表观看电视指南的不同方式。
在NDroid Application
类中
static enum guideView { GUIDE_VIEW_SEVEN_DAY, GUIDE_VIEW_NOW_SHOWING, GUIDE_VIEW_ALL_TIMESLOTS }
…当用户改变视图的事件处理程序从0-2收到一个int
,我想做这样的事情…
在一个Android Activity
onClick(DialogInterface dialog, int which)
事件处理程序
// 'which' is an int from 0-2 switch (which) { case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY: ... break; }
我习惯于C#枚举和select/ case语句,这将允许上面的东西,我知道Java做不同的事情,但我只是无法理解我需要做什么。
我将不得不诉诸if
陈述? 有可能只有3个select,所以我可以做到这一点,但我想知道如何用Java中的开关箱来完成。
编辑抱歉,我没有完全展开这个问题,因为我把它看作是一个普通的Java问题。 我已经join了这个问题来进一步解释。
没有什么特定于Android的东西,这就是为什么我没有把它标记为Android,但是枚举是在Application
类中定义的,而且我不希望交换机的代码在Activity
。 枚举是静态的,因为我需要从多个活动访问它。
你缺less的部分是从整数转换为types安全的枚举。 Java不会自动执行。 有几种方法可以解决这个问题:
- 使用静态final int列表而不是types安全的枚举,并打开您接收到的int值(这是Java 5之前的方法)
- 打开一个指定的id值(如heneryville所述 )或枚举值的序数值; 即
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
-
确定由int值表示的枚举值,然后打开枚举值。
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; } }
您可能会发现它更有帮助/更less的错误容易编写自定义
valueOf
实现,将您的整数值作为参数来解决适当的枚举值,并让您集中您的边界检查。
如果whichView
是GuideView Enum的一个对象,下面的工作很好。 请注意, case
后面没有限定符。
switch (whichView) { case SEVEN_DAY: ... break; case NOW_SHOWING: ... break; }
这些枚举不应该像案例标签那样限定,就像你有NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
,而应该去除限定条件并使用GUIDE_VIEW_SEVEN_DAY
这应该以你描述的方式工作。 你遇到了什么错误? 如果你可以pastebin你的代码,这将有所帮助。
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
编辑:你确定你想定义一个静态枚举吗? 这听起来不正确。 一个枚举很像其他任何对象。 如果你的代码编译并运行,但给出不正确的结果,这可能是为什么。
enumerations accessing is very simple in switch case private TYPE currentView; //declaration of enum public enum TYPE { FIRST, SECOND, THIRD }; //handling in switch case switch (getCurrentView()) { case FIRST: break; case SECOND: break; case THIRD: break; } //getter and setter of the enum public void setCurrentView(TYPE currentView) { this.currentView = currentView; } public TYPE getCurrentView() { return currentView; } //usage of setting the enum setCurrentView(TYPE.FIRST); avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always
我是这样做的
public enum State { // Retrieving, // the MediaRetriever is retrieving music // Stopped, // media player is stopped and not prepared to play Preparing, // media player is preparing... Playing, // playback active (media player ready!). (but the media player // may actually be // paused in this state if we don't have audio focus. But we // stay in this state // so that we know we have to resume playback once we get // focus back) Paused; // playback paused (media player ready!) //public final static State[] vals = State.values();//copy the values(), calling values() clones the array }; public State getState() { return mState; }
并在Switch语句中使用
switch (mService.getState()) { case Stopped: case Paused: playPause.setBackgroundResource(R.drawable.selplay); break; case Preparing: case Playing: playPause.setBackgroundResource(R.drawable.selpause); break; }
短关联函数示例:
public String getIcon(TipoNotificacao tipo) { switch (tipo){ case Comentou : return "fa fa-comments"; case ConviteEnviou : return "icon-envelope"; case ConviteAceitou : return "fa fa-bolt"; default: return ""; } }
就像@Dhanushka所说,省略“开关”里面的限定符是关键。