Android开发笔记(5):常量的合理使用
2021-01-28 本文已影响0人
叶满林
今天,我们来聊一些“细枝末节”的问题——java中的常量。觉得很有意思,给大家分享一下:
下面是我见过的几种常量定义操作:
1.普通款:
public class Constants {
private Constants(){}
public static final int MAX = Integer.MAX_VALU;//最大值
public static final int MIN = Integer.MIN_VALU;//最小值
}
最简单的一种,需要定义成final且定义一个private的构造方法,这样做是为了不让其他类继承,禁止实例化此类,调用时直接以"类.常量"的方式调用。
当然,大部分时候,我们都放在相关的类里,而不是单独抽取出来。
2.接口
public interface Constants {
int MAX = Integer.MAX_VALUE;//最大值
int MIN = Integer.MIN_VALU;//最小值
}
接口中定义,接口中的"变量"默认都是 "public static final"类型,即为常量,因此接口可以省略。
3.枚举款(这个详细说一下)
假设服务端下发了一个“tag”字段,1代表通过,2代表不通过,3代表延期审核。枚举可以这样用:
public enum Constants {
PASS(1),NOPASS(2),DELAY(3);
private final int state;
Constants(int state){
this.state = state;
}
public int getstate() {
return state;
}
}
//使用
...
if (getUserState() == Constants.PASS.getstate()) {
//此人审核未通过
}
他的优点有啥呢?
(1)枚举常量更简单
枚举只需要定义每个枚举项,不需要定义枚举值。
(2)枚举常量属于稳态型
以上面的代码举例:得到数据以后getUserState(),普通常量,你需要判断边界值,比如获取的值为-1就会出现很多问题。而枚举只能是其中一个实例。
(3)扩展性强
有一天产品告诉你,现在需要根据状态相应颜色,分别是“红色”、“蓝色”、“白色”。
那么只要稍微改一下代码就完事了。
public enum Constants {
PASS(1,Colors.red),NOPASS(2,Colors.buld),DELAY(3,,Colors.red);
private final int state;
private final int color;
Constants(int state,int color){
this.state = state;
this.color =cor
}
public int getcolor() {
return color;
}
}
方法实现接口,demo(@Contract.Type int action) 用注解标明方法使用常量,增加了常量与方法的关联感
(4)注解款
@IntDef({SELECT_ACHIEVEMENT, SELECT_TASK, SELECT_MEMBER, SELECT_BUY})
@Retention(RetentionPolicy.SOURCE)
@interface SelectBuyType {
}