使用带有switch语句的enum的Java

使用带有switch语句的enum的Java,java,enums,switch-statement,Java,Enums,Switch Statement,我看过很多类似于这个问题的问答,但还没有找到解决办法 我所拥有的是一个枚举,它代表了查看电视指南的不同方式 在NDroid应用程序类中 …当用户更改视图时,事件处理程序会从0-2接收一个int,我想这样做 在Android活动onClickDialogInterface对话框中,int哪个事件处理程序 // 'which' is an int from 0-2 switch (which) { case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:

我看过很多类似于这个问题的问答,但还没有找到解决办法

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

在NDroid应用程序类中

…当用户更改视图时,事件处理程序会从0-2接收一个int,我想这样做

在Android活动onClickDialogInterface对话框中,int哪个事件处理程序

// 'which' is an int from 0-2
switch (which) {
    case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
    ...
    break;
}
我习惯于使用C enum和select/case语句,这将允许类似于上述内容的操作,我知道Java的操作方式有所不同,但我无法理解我需要做什么

我是否必须求助于if语句?可能只有3种选择,所以我可以这样做,但我想知道如何用Java中的switch case来实现

很抱歉,我没有完全扩展这个问题,因为我认为它是一个通用的Java问题。我对这个问题作了进一步的解释


没有任何特定于Android的东西,这就是为什么我没有将其标记为Android,但枚举是在应用程序类中定义的,我不希望开关出现在活动中的代码。枚举是静态的,因为我需要从多个活动访问它。

这应该按照您描述的方式工作。你犯了什么错误?如果你能粘贴你的代码,那会有帮助


编辑:是否确实要定义静态枚举?我听上去不太对。枚举非常类似于任何其他对象。如果您的代码编译并运行,但给出了不正确的结果,这可能就是原因。

枚举不应该像NDroid.guideView.GUIDE\u VIEW\u SEVEN\u DAY一样在大小写标签中限定,相反,您应该删除限定并使用GUIDE_VIEW_SEVEN_DAY

缺少的部分正在从整数转换为类型安全枚举。Java不会自动完成这项工作。有两种方法可以做到这一点:

使用静态final int列表,而不是类型安全的枚举,并打开收到的int值这是Java 5之前的方法 打开指定的id值作为或枚举值的序数值;i、 e.引导视图。引导视图。七天。依次 确定由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实现更有用/更不容易出错,该实现将整数值作为参数来解析适当的枚举值,并允许集中边界检查

如果其中的视图是GuideView枚举的对象,则以下操作效果良好。请注意,大小写后的常量没有限定符

我是这样做的

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所说,省略开关中的限定符是关键。

我喜欢Java enum的一些用法:

.name允许您获取字符串形式的枚举名称。 .ordinal允许您获取基于0的整数值。 可以为每个枚举附加其他值参数。 当然,开关已启用。 具有值参数的枚举:

    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;

应在适当进口后七天内提供案例指南;您遇到了什么问题?不能让事件处理程序接收枚举吗?除此之外,也许这会有所帮助:@Dave:Ooops对不起,我已经更正了代码以显示它是如何工作的。Eclipse给了我一个类型不匹配错误,说它无法从guideView转换为int。@Brian:这是一个Android应用程序,事件处理程序OnClickListener是由我必须实现的DialogInterface接口定义的。@MisterSquonk哦,我错过了你从int获取的信息抱歉,请看Ophidian的回答,虽然我将功能放在了枚举中,但嵌套的枚举类型是隐式静态的。允许显式地将嵌套枚举类型声明为静态。-@trashgod,的确如此-但我总是使用隐式声明来避免混淆,因为这在我看来更明显。我假设的全局静态枚举在大多数情况下可能是错误的。非常感谢。我花了一段时间才将其应用到我的代码中,但现在它与您发布的示例代码配合得很好。6年的C语言学习和1年的Java语言学习——我很少遇到让我难堪的事情。有很多相似之处,但偶尔也会有这样的不同之处。我不会很快忘记这个-case语句中需要非限定的枚举名称,因此case-GuideView.SEVEN_-DAY:给出了一个编译错误,它应该是case-SEVEN_-DAY:。仅当您没有从外部获取数据时才有效。因为OP说返回值1,2,3不是一个类型,所以如果没有一个相反的开关案例,在进入他列出的开关案例之前,这个案例接受1,2,3并返回一个类型,那么你的方法将无法工作。。
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 "";
    }
}
    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;