Android - 用@IntDef替换参数化枚举

时间:2017-08-03 11:57:46

标签: java android enums

如何使用@IntDef 来避免参数化枚举

  1. 我想保留一些与每个枚举/类型相关的静态细节(如关联的URl,相关的drawable等)。

    TYPE_ONE(R.string.res, Urls.URL1),
    
    TYPE_TWO(R.string.res, Urls.URL2),
    
    TYPE_THREE(R.string.res, Urls.URL3),
    
    TYPE_FOUR(R.string.res, Urls.URL4),
    
    TYPE_FIVE(R.string.res, Urls.URL5),
    
    TYPE_SIX(R.string.res, Urls.URL6);
    
    private final int mResId;
    private final String mUrl;
    
    Types(int titleResId, String url) {
      mResId = titleResId;
      mUrl = url;
    }
    
    public int getRes() {
       return mTitleResId;
    }
    
    public String getURL() {
       return mUrl;
    }
    
  2. 这样做的优化方法是什么?

1 个答案:

答案 0 :(得分:1)

我知道enum消耗的资源比整数多得多,并且在Android上禁止使用它们,但是,在您描述的情况下,我认为开销可以通过增益来补偿在可读性方面。

话虽这么说,使用@IntDef并将更多变量链接到它的一种方法可能是私有地和静态地声明所需资源的数组,并使用传递@IntDef的静态getter访问它们。

public class Constants {

    public static final int PAGE_ONE = 0;
    public static final int PAGE_TWO = 1;
    public static final int PAGE_THREE = 2;

    @IntDef(value={PAGE_ONE, PAGE_TWO, PAGE_THREE})
    public @interface PageType {}

    private static final SparseArray<String> PAGE_TITLES = new SparseArray<>();
    private static final SparseArray<Integer> PAGE_IMAGES = new SparseArray<>();
    static {
        PAGE_TITLES.put(PAGE_ONE, "PAGE_ONE");
        PAGE_IMAGES.put(PAGE_ONE, R.drawable.page_one);

        PAGE_TITLES.put(PAGE_TWO, "PAGE_TWO");
        PAGE_IMAGES.put(PAGE_TWO, R.drawable.page_two);

        PAGE_TITLES.put(PAGE_THREE, "PAGE_THREE");
        PAGE_IMAGES.put(PAGE_THREE, R.drawable.page_three);
    }

    public static int getPageDrawable(@PageType int pageNumber){
        return PAGE_IMAGES.get(pageNumber);
    }

    public static String getPageTitle(@PageType int pageNumber){
        return PAGE_TITLES.get(pageNumber);
    }

    private Constants(){}
}