Java使用带有switch语句的枚举

时间:2011-11-13 01:46:10

标签: java enums switch-statement

我已经查看了类似于这个问题的各种Q& As,但是还没有找到解决方案。

我所拥有的是一个枚举,代表了查看电视指南的不同方式......

在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#enums和select / case语句,这些语句允许类似上面的东西,我知道Java做的事情有所不同,但我无法理解我需要做什么。

我是否必须诉诸if陈述?可能只有3个选择,所以我可以做到但我想知道如何用Java中的switch-case完成它。

编辑抱歉,我没有完全扩展这个问题,因为我认为它是一个通用的Java问题。我已经添加了这个问题来进一步解释。

没有任何特定于Android的内容,这就是为什么我没有将其标记为Android,但是枚举是在Application类中定义的,而我不想切换的代码在{{ 1}}。枚举是静态的,因为我需要从多个活动中访问它。

8 个答案:

答案 0 :(得分:152)

您缺少的部分是从整数转换为类型安全的枚举。 Java不会自动执行此操作。有几种方法可以解决这个问题:

  1. 使用静态最终整数列表而不是类型安全枚举,并打开您收到的int值(这是Java 5之前的方法)
  2. 启用指定的id值(如described by 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;
        }
    }
    

    您可能会发现编写自定义valueOf实现更有帮助/更不容易出错,该实现将整数值作为参数来解析相应的枚举值,并允许您集中边界检查。

    < / LI>

答案 1 :(得分:39)

如果whichView是GuideView枚举的对象,则以下效果很好。请注意,case之后的常量没有限定符。

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}

答案 2 :(得分:12)

枚举不应该在案例标签中被限定为NDroid.guideView.GUIDE_VIEW_SEVEN_DAY,而应取消资格并使用GUIDE_VIEW_SEVEN_DAY

答案 3 :(得分:5)

我喜欢Java枚举的一些用法:

  1. .name()允许您在String中获取枚举名称。
  2. .ordinal()允许您获取整数值,基于0。
  3. 您可以为每个枚举附加其他值参数。
  4. ,当然,启用了开关。
  5. 枚举值参数:

        enum StateEnum {
            UNDEFINED_POLL  ( 1 * 1000L,       4 * 1000L),
            SUPPORT_POLL    ( 1 * 1000L,       5 * 1000L),
            FAST_POLL       ( 2 * 1000L,  4 * 60 * 1000L),
            NO_POLL         ( 1 * 1000L,       6 * 1000L); 
            ...
        }
    

    切换示例:

    private void queuePoll(StateEnum se) {
        // debug print se.name() if needed
        switch (se) {
            case UNDEFINED_POLL:
                ...
                break;
            case SUPPORT_POLL:
                ...
                break;
    

答案 4 :(得分:3)

这应该按照您描述的方式工作。你遇到了什么错误?如果你可以粘贴你的代码,那将有所帮助。

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

编辑:您确定要定义静态枚举吗?这对我来说听起来不对。枚举与任何其他对象非常相似。如果您的代码编译并运行但结果不正确,这可能就是原因。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

我这样做

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 Statement中使用

switch (mService.getState())
{
case Stopped:
case Paused:

    playPause.setBackgroundResource(R.drawable.selplay);
    break;

case Preparing:
case Playing:

    playPause.setBackgroundResource(R.drawable.selpause);
    break;    
}

答案 7 :(得分:1)

短关联函数示例:

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所说,省略内部的限定符&#34; switch&#34;是关键。