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

4
我该如何避免使用带有@IntDef的参数化枚举?
  1. I want keep some static details associated with each enum/type (like associated URl , associated drawable etc.).

    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;
    }
    
这个要怎么最优化呢?

你所描述的似乎是使用枚举的合理理由。 - lelloman
为了避免使用switch/if语句,EnumClassName.TYPE_ONE.getURL()将返回相应的URL。 - Don Chakkappan
假设我有10个不同的活动,每个活动都会加载一个URL和标题。也许我可以在每个活动中硬编码URL和标题。但是如果我使用枚举,我可以将所有细节集中起来,只需要从主活动传递枚举即可。 - Don Chakkappan
既然使用枚举看起来是一个好的情景,那么为什么你想要使用IntDef呢? - lelloman
但是Google强烈建议避免使用枚举。:( 请阅读 https://infinum.co/the-capsized-eight/magic-constants-in-android-development - Don Chakkappan
显示剩余2条评论
1个回答

1
我知道enum比整数消耗更多的资源,并且在Android上被禁止使用,但是在像你描述的这种情况下,我认为开销可以通过可读性的提高来补偿。

话虽如此,一种使用@IntDef并将更多变量链接到它的方法是,私下静态声明所需资源的数组,并使用静态getter传递@IntDef来访问它们。

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(){}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接