0
点赞
收藏
分享

微信扫一扫

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.总结

虽然枚举可以很有效的限制元素的取值范围,但是这是以牺牲性能为前提的。安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存。所以呢,如果追求性能的话,建议使用@IntDef来限制元素的取值范围。


举报

相关推荐

0 条评论