How to ensure completeness in an enum switch at compile time?

后端 未结 12 1035
悲&欢浪女
悲&欢浪女 2020-11-27 06:25

I have several switch statements which test an enum. All enum values must be handled in the switch statements by a case s

12条回答
  •  没有蜡笔的小新
    2020-11-27 06:50

    I know the question is about Java, and I think the answer for pure Java is clear: it's not a built-in feature, but there are workarounds. For those who arrive here and are working on Android or other systems that can utilize Kotlin, that language provides this feature with its when expression, and the interop with Java allows it to be rather seamless, even if this is the only Kotlin code in your codebase.

    For example:

    public enum HeaderSignalStrength {
      STRENGTH_0, STRENGTH_1, STRENGTH_2, STRENGTH_3, STRENGTH_4;
    }
    

    With my original Java code as:

    // In HeaderUtil.java
    @DrawableRes
    private static int getSignalStrengthIcon(@NonNull HeaderSignalStrength strength) {
      switch (strength) {
        case STRENGTH_0: return R.drawable.connection_strength_0;
        case STRENGTH_1: return R.drawable.connection_strength_1;
        case STRENGTH_2: return R.drawable.connection_strength_2;
        case STRENGTH_3: return R.drawable.connection_strength_3;
        case STRENGTH_4: return R.drawable.connection_strength_4;
        default:
          Log.w("Unhandled HeaderSignalStrength: " + strength);
          return R.drawable.cockpit_connection_strength_0;
      }
    }
    
    // In Java code somewhere
    mStrength.setImageResource(HeaderUtil.getSignalStrengthIcon(strength));
    

    Can be rewritten with Kotlin:

    // In HeaderExtensions.kt
    @DrawableRes
    fun HeaderSignalStrength.getIconRes(): Int {
        return when (this) {
            HeaderSignalStrength.STRENGTH_0 -> R.drawable.connection_strength_0
            HeaderSignalStrength.STRENGTH_1 -> R.drawable.connection_strength_1
            HeaderSignalStrength.STRENGTH_2 -> R.drawable.connection_strength_2
            HeaderSignalStrength.STRENGTH_3 -> R.drawable.connection_strength_3
            HeaderSignalStrength.STRENGTH_4 -> R.drawable.connection_strength_4
        }
    }
    
    // In Java code somewhere
    mStrength.setImageResource(HeaderExtensionsKt.getIconRes(strength));
    

提交回复
热议问题