Android使用枚舉正確姿態(tài)

那實(shí)際開發(fā)中肯定是要用Java枚舉的进肯,那有沒(méi)有什么解決辦法了岂傲。答案肯定是有的痰洒,只是換成另外一種方式

/**
* Android枚舉
*/
public class TestEnum {
  /**
   * @Retention(RetentionPolicy.SOURCE) 注解可以告知編譯器不將枚舉的注解數(shù)據(jù)存儲(chǔ)在 .class 文件中
   *
   */
  /**
   * @StringDef創(chuàng)建整型和字符串集的枚舉注解來(lái)驗(yàn)證其他類型的代碼引用
   * 具體詳細(xì)看官網(wǎng){@link https://developer.android.com/studio/write/annotations.html?hl=zh-cn#adding-annotations}
   */
  @Retention(RetentionPolicy.SOURCE)
  @StringDef({
          POWER_SERVICE,
          WINDOW_SERVICE,
          LAYOUT_INFLATER_SERVICE
  })
  //@interface這是Java用來(lái)定義一個(gè)注解類。
  public @interface ServiceName {}
  public static final String POWER_SERVICE = "power";
  public static final String WINDOW_SERVICE = "window";
  public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
  public static String getSystemService(@ServiceName String name) {
      if (POWER_SERVICE.equals(name)) {
          return POWER_SERVICE;
      } else if (WINDOW_SERVICE.equals(name)) {
          return WINDOW_SERVICE;
      } else if (LAYOUT_INFLATER_SERVICE.equals(name)) {
          return LAYOUT_INFLATER_SERVICE;
      }
      return null;
  }
  public static void main(String[] args) {
      //使用
System.out.println(TestEnum.getSystemService(TestEnum.LAYOUT_INFLATER_SERVICE));
  }
}

這就是官網(wǎng)的寫法了瘟裸】筒妫可是發(fā)現(xiàn)每次傳參數(shù)是

TestEnum.LAYOUT_INFLATER_SERVICE
或者
TestEnum.POWER_SERVICE

而不是像我們Java枚舉的傳參方式

ServiceName.LAYOUT_INFLATER_SERVICE

那是不是需要改造下。查看資料可以這樣寫

/**
 * Android枚舉
 */
public class TestEnum {
    /**
     * @Retention(RetentionPolicy.SOURCE) 注解可以告知編譯器不將枚舉的注解數(shù)據(jù)存儲(chǔ)在 .class 文件中
     *
     */
    /**
     * @StringDef創(chuàng)建整型和字符串集的枚舉注解來(lái)驗(yàn)證其他類型的代碼引用 具體詳細(xì)看官網(wǎng){@link https://developer.android.com/studio/write/annotations.html?hl=zh-cn#adding-annotations}
     */
    @Retention(RetentionPolicy.SOURCE)
    @StringDef({
            ServiceName.POWER_SERVICE,
            ServiceName.WINDOW_SERVICE,
            ServiceName.LAYOUT_INFLATER_SERVICE
    })
    //@interface這是Java用來(lái)定義一個(gè)注解類话告。
    public @interface ServiceName {
        String POWER_SERVICE = "power";
        String WINDOW_SERVICE = "window";
        String LAYOUT_INFLATER_SERVICE = "layout_inflater";
    }

    public static String getSystemService(@ServiceName String name) {
        if (ServiceName.POWER_SERVICE.equals(name)) {
            return ServiceName.POWER_SERVICE;
        } else if (ServiceName.WINDOW_SERVICE.equals(name)) {
            return ServiceName.WINDOW_SERVICE;
        } else if (ServiceName.LAYOUT_INFLATER_SERVICE.equals(name)) {
            return ServiceName.LAYOUT_INFLATER_SERVICE;
        }
        return null;
    }

    public static void main(String[] args) {
        //使用
        System.out.println(TestEnum.getSystemService(ServiceName.LAYOUT_INFLATER_SERVICE));
    }
}

不錯(cuò)兼搏,就是把常量放到里面去了。這個(gè)時(shí)候差不多好了沙郭,不過(guò)怎么看

public static String getSystemService(@ServiceName String name) {
        if (ServiceName.POWER_SERVICE.equals(name)) {
            return ServiceName.POWER_SERVICE;
        } else if (ServiceName.WINDOW_SERVICE.equals(name)) {
            return ServiceName.WINDOW_SERVICE;
        } else if (ServiceName.LAYOUT_INFLATER_SERVICE.equals(name)) {
            return ServiceName.LAYOUT_INFLATER_SERVICE;
        }
        return null;
    }

這個(gè)代碼還是有點(diǎn)怪怪的佛呻,每次添加一個(gè)值都需要加一個(gè)else if太麻煩了。在Java中可以通過(guò)enum.values()獲取所有enum的值那是不是有類似的方法病线,找了資料好像沒(méi)有發(fā)現(xiàn)吓著,那只能通過(guò)反射獲取所有的public的參數(shù)和參數(shù)值了

public static String getSystemService(@ServiceName String name) {
        Field[] fields = ServiceName.class.getDeclaredFields();
        for (Field field : fields) {
            //在反射對(duì)象中設(shè)置 accessible 標(biāo)志允許具有足夠特權(quán)的復(fù)雜應(yīng)用程序(比如 Java Object Serialization 或其他持久性機(jī)制)以某種通常禁止使用的方式來(lái)操作對(duì)象
            field.setAccessible(true);
            String value = null;
            try {
                value = String.valueOf(field.get(field.getName()));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            if (value != null && value.equals(name)) {
                return value;
            }
        }
        return null;
    }

ok完成,代碼地址

這里有幾個(gè)知識(shí)點(diǎn)參考資料鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送挑,一起剝皮案震驚了整個(gè)濱河市绑莺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕耕,老刑警劉巖纺裁,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赡突,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)区赵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惭缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笼才,你說(shuō)我怎么就攤上這事漱受。” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵昂羡,是天一觀的道長(zhǎng)絮记。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虐先,這世上最難降的妖魔是什么怨愤? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蛹批,結(jié)果婚禮上撰洗,老公的妹妹穿的比我還像新娘。我一直安慰自己腐芍,他們只是感情好差导,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猪勇,像睡著了一般设褐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泣刹,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天助析,我揣著相機(jī)與錄音,去河邊找鬼项玛。 笑死貌笨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的襟沮。 我是一名探鬼主播锥惋,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼开伏!你這毒婦竟也來(lái)了膀跌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤固灵,失蹤者是張志新(化名)和其女友劉穎捅伤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巫玻,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丛忆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仍秤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熄诡。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诗力,靈堂內(nèi)的尸體忽然破棺而出凰浮,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布袜茧,位于F島的核電站菜拓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏笛厦。R本人自食惡果不足惜纳鼎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望递递。 院中可真熱鬧喷橙,春花似錦、人聲如沸登舞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菠秒。三九已至疙剑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間践叠,已是汗流浹背言缤。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禁灼,地道東北人管挟。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弄捕,于是被迫代替她去往敵國(guó)和親僻孝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理守谓,服務(wù)發(fā)現(xiàn)穿铆,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法斋荞,類相關(guān)的語(yǔ)法荞雏,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法平酿,異常的語(yǔ)法凤优,線程的語(yǔ)...
    子非魚_t_閱讀 31,639評(píng)論 18 399
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,884評(píng)論 2 8
  • vim模式介紹 幾乎所有的編輯器都會(huì)有插入和執(zhí)行命令兩種模式,并且大多數(shù)的編輯器使用了與Vim截然不同的方式:命令...
    EldonZhao閱讀 561評(píng)論 0 3
  • 01 我是一個(gè)孤獨(dú)癥患者蜈彼,有人說(shuō)筑辨,越是向往明天的人,越是孤獨(dú)柳刮。 騎著單車挖垛,頂著四十度的高溫,在這座寂靜的城市里瘋狂...
    昨日的酒閱讀 409評(píng)論 7 9