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不会自动执行。 有几种方法可以解决这个问题:

  1. 使用静态final int列表而不是types安全的枚举,并打开您接收到的int值(这是Java 5之前的方法)
  2. 打开一个指定的id值(如heneryville所述 )或枚举值的序数值; 即guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. 确定由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所说,省略“开关”里面的限定符是关键。