天天看點

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.總結