天天看点

Android使用@IntDef和枚举enum限制元素取值范围的比较

枚举的作用就是

定义此元素允许的常量

1.使用@IntDef限制元素的取值范围

package com.wong.ex;

import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class MainActivity extends AppCompatActivity {

    //先定义 常量
    public static final int SUNDAY = 0;
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;

    // 定义@WeekDays注解
    @IntDef({SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY})
    @Retention(RetentionPolicy.SOURCE)
    public @interface WeekDays {
    }

    // 声明变量,限制变量的取值范围
    @WeekDays
    int currentDay = SUNDAY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 声明变量,限制变量的取值范围
        @WeekDays int today = getCurrentDay();

        switch (today) {
            case SUNDAY:
                break;
            case MONDAY:
                break;
            case TUESDAY:
                break;
            case WEDNESDAY:
                break;
            case THURSDAY:
                break;
            case FRIDAY:
                break;
            case SATURDAY:
                break;
            default:
                break;
        }
        setCurrentDay(SUNDAY)
    }

    // 添加@WeekDays注解,限制传入值的范围
    public void setCurrentDay(@WeekDays int currentDay) {
        this.currentDay = currentDay;
    }

    // 添加@WeekDays注解,限制返回值的范围
    @WeekDays
    public int getCurrentDay() {
        return currentDay;
    }
}      

虽然getCurrentDay()方法使用了@WeekDays注解限制它返回的值的范围,但是从实践来看,限制的作用有时会失效,如:

@WeekDays
    public int getCurrentDay() {
        return 888;
    }      

上面的代码@WeekDays起作用了,因为888不是所期望的取值。但是也仅仅是提示而已,告诉你必须是那些上面定义的那些常量。编译依然能通过,程序照样运行。下面这种,干脆就不提示了:

@WeekDays
    public int getCurrentDay() {
        return currentDay+888;
    }      

setCurrentDay()方法也是有同样的问题。

总的来说@IntDef的限制,感觉没有那么严格。

2.使用枚举来限制元素的取值范围

public class MainActivity extends AppCompatActivity {

    //先定义 常量
    public static final int SUNDAY = 0;
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;

    private enum WeekDays {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    WeekDays currentDay = WeekDays.SUNDAY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //声明变量
        WeekDays today = getCurrentDay();

        switch (today) {
            case SUNDAY:
                break;
            case MONDAY:
                break;
            case TUESDAY:
                break;
            case WEDNESDAY:
                break;
            case THURSDAY:
                break;
            case FRIDAY:
                break;
            case SATURDAY:
                break;
            default:
                break;
        }

        setCurrentDay(WeekDays.SUNDAY);
    }
    public void setCurrentDay(WeekDays currentDay) {
        this.currentDay = currentDay;
    }
    public WeekDays getCurrentDay() {
        return currentDay;
    }
}      

3.总结