教你使用Android自带注解@IntDef代替Enum (枚举)

来源:互联网 发布:苏州网络电视台 编辑:程序博客网 时间:2024/06/14 02:49

当我们的业务需求变的多起来的时候,我们这个时候可能都需要对每个需求加上点击事件,这个时候我们经常使用枚举类来实现这种变化,举个例子常见的业务场景出现在MineFragment界面,可能出现item列表界面,当我们为它们设置item点击事件的时候,我们把所有数据封装进去bean集合里面,然后添加一个枚举类型来标识,相对于用position来标识这样的做法适应于减少业务需求不断改变带来的修改代码的繁琐。

public enum MineItemType {    MINE_ACCOUNT, // 账户    MIME_QRCODE, // 二维码    MINE_TRANSACTION_RECORDS, // 交易记录    MINE_TRANSFER, // 转账    MINE_RECHARGE, // 话费充值}

然后我们在bean中可以这样写

public class MineItemBean {    private MineItemType itemType;//菜单类型    private int iconID;    private String itemName;    private String itemValue;    private boolean isTitle;    public MineItemBean (MineItemType itemType, int iconID, String itemName,boolean isTitle) {        this.itemType = itemType;        this.iconID = iconID;        this.itemName = itemName;        this.isTitle = isTitle;    }    public MineItemType getItemType() {        return itemType;    }    public void setItemType(MineItemType itemType) {        this.itemType = itemType;    }    public int getIconID() {        return iconID;    }    public void setIconID(int iconID) {        this.iconID = iconID;    }    public String getItemName() {        return itemName;    }    public void setItemName(String itemName) {        this.itemName = itemName;    }    public String getItemValue() {        return itemValue;    }    public void setItemValue(String itemValue) {        this.itemValue = itemValue;    }    public boolean isTitle() {        return isTitle;    }    public void setTitle(boolean title) {        isTitle = title;    }}

这样写看上去很简单很方便, 但是官方文档说明,安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存。于是我们想有没有一种方式能代替枚举的这种写法呢,当然有,谷歌为我们提供了 @IntDef

public class MineItemType {    private byte tab;    public static final byte MINE_ACCOUNT=0;    public static final byte MIME_QRCODE=1;    public static final byte MINE_TRANSACTION_RECORDS=2;    public static final byte MINE_TRANSFER=3;    public static final byte MINE_RECHARGE=4;    //用 @IntDef "包住" 常量;    // @Retention 定义策略    // 声明构造器    @IntDef({MINE_ACCOUNT, MIME_QRCODE, MINE_TRANSACTION_RECORDS,MINE_TRANSFER,MINE_RECHARGE})    @Retention(RetentionPolicy.SOURCE)    public @interface Tab{}    @Tab    public byte getTab() {        return tab;    }    public void setTab(@Tab byte tab) {        this.tab = tab;    }}

然后我们在MineItemBean 可以改写成这样

public class MineItemBean {    private byte type; //类型    private int iconID;    private String itemName;    private String itemValue;    private boolean isTitle;    public MineItemBean (@MineItemType.Tab byte type, int iconID, String itemName,boolean isTitle) {        this.type= type;        this.iconID = iconID;        this.itemName = itemName;        this.isTitle = isTitle;    }    public byte getType() {        return type;    }    public void setType(byte type) {        this.type = type;    }    public int getIconID() {        return iconID;    }    public void setIconID(int iconID) {        this.iconID = iconID;    }    public String getItemName() {        return itemName;    }    public void setItemName(String itemName) {        this.itemName = itemName;    }    public String getItemValue() {        return itemValue;    }    public void setItemValue(String itemValue) {        this.itemValue = itemValue;    }    public boolean isTitle() {        return isTitle;    }    public void setTitle(boolean title) {        isTitle = title;    }}

基本就是这样实现的,最后我们使用的时候就这样的写

  switch (bean.getType()){       case MineItemType.MINE_ACCOUNT:           break;       case MineItemType.MIME_QRCODE:           break;       case MineItemType.MINE_TRANSACTION_RECORDS:           break;       case MineItemType.MINE_TRANSFER:           break;       case MineItemType.MINE_RECHARGE:           break;   }
0 0