關于R.id.XX是否可以作為Case的鍵值?(轉(zhuǎn)載)

關于R.id.XX是否可以作為Case的鍵值棍丐?

(2015-05-26 10:25:12

移植一個項目到框架中误辑,原項目代碼中使用:

swich(id)

case R.id.XX:break;

case R.id.XX:break;

代碼不報錯,但我移植到我的Frame框架中(Frame框架是作為庫存在的)報錯歌逢,提示case鍵必須使用常量巾钉。

開始想不明白,為什么兩個項目中會有如此區(qū)別呢秘案?后來看了一篇博客砰苍,才恍然大悟潦匈。

Case 標簽中的常量字段——在正常的 Android 項目中,資源R類里的常量是這樣聲明的:

public static final int main=0x7f030004;

然而赚导,到 ADT 14為止茬缩,在類庫項目中,他們會被這樣聲明:

public static int main=0x7f030004;

換句話說吼旧,在庫項目中這些常量都不是final的凰锡。原因很簡單:當多個庫項目整合時,字段的實際值(必須是唯一的)可能會出現(xiàn)碰撞圈暗。在ADT 14 之前掂为,所有這樣的字段都是final的,所以導致所有的庫被使用的時候员串,主項目必須編譯他們的所有資源和相關 Java 代碼勇哗。這樣的性能是很差的,因為它使構建的速度非常慢寸齐。它還阻礙了不包含源代碼的庫項目的分發(fā)欲诺,限制庫項目的使用范圍。

字段不再是 final 的原因是意味著庫jar包可以只編譯一次渺鹦,并且能直接在其他項目中復用瞧栗。以及允許分發(fā)庫項目的二進制版本(將在 r15出現(xiàn)),這使得構建更快海铆。

然而,它對庫的源碼也有一個影響挣惰。以下形式的代碼將不再能夠編譯:

int id = view.getId(); switch (id) { case R.id.button1: action1(); break; case R.id.button2: action2(); break; case R.id.button3: action3(); break; }

這是因為switch語句需要所有case的標簽卧斟,如R.id.button1,在編譯時是個常量 (這樣值可以直接復制到.class 文件中)憎茂。

為此解決方案很簡單:

將 switch 語句轉(zhuǎn)換成 if-else 語句珍语。幸運的是,這在 Eclipse 中操作起來很簡單竖幔。只需要將插入符號放在switch關鍵字上板乙,并按 Ctrl+1 (在Mac上是 Cmd+1):

在上述場景中,它將把switch語句轉(zhuǎn)換成如下: int id = view.getId(); if (id == R.id.button1) { action1(); } else if (id == R.id.button2) { action2(); } else if (id == R.id.button3) { action3(); }

這通常是在 UI 代碼中拳氢,并且它對性能的影響可以忽略不計募逞。

我們有一個檢測器,可以發(fā)現(xiàn)這些錯誤 (引用R字段的非常量 case 標簽)馋评,并提供問題的簡要說明 (并指向此頁面以獲取詳細信息放接。) 有關自動檢測的詳細信息。

P.S. 如果你的 switch 語句如下所示:

switch (view.getId()) {

那么結(jié)果會轉(zhuǎn)換成每一個if檢查都重復調(diào)用 view.getId() 的效率低下的if/else鏈留特。你需要先提取此表達式 (使用“提取本地變量(Extract Local Variable)”的重構快捷鍵鍵)纠脾,然后再轉(zhuǎn)換這條 switch 語句玛瘸。

轉(zhuǎn):http://www.2cto.com/kf/201411/356045.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苟蹈,隨后出現(xiàn)的幾起案子糊渊,更是在濱河造成了極大的恐慌,老刑警劉巖慧脱,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渺绒,死亡現(xiàn)場離奇詭異,居然都是意外死亡磷瘤,警方通過查閱死者的電腦和手機芒篷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來采缚,“玉大人针炉,你說我怎么就攤上這事“獬椋” “怎么了篡帕?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贸呢。 經(jīng)常有香客問我镰烧,道長,這世上最難降的妖魔是什么楞陷? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任怔鳖,我火速辦了婚禮,結(jié)果婚禮上固蛾,老公的妹妹穿的比我還像新娘结执。我一直安慰自己,他們只是感情好艾凯,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布献幔。 她就那樣靜靜地躺著,像睡著了一般趾诗。 火紅的嫁衣襯著肌膚如雪蜡感。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天恃泪,我揣著相機與錄音郑兴,去河邊找鬼。 笑死贝乎,一個胖子當著我的面吹牛杈笔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糕非,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蒙具,長吁一口氣:“原來是場噩夢啊……” “哼球榆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禁筏,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤持钉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篱昔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體每强,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年州刽,在試婚紗的時候發(fā)現(xiàn)自己被綠了空执。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡穗椅,死狀恐怖辨绊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匹表,我是刑警寧澤门坷,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站袍镀,受9級特大地震影響默蚌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苇羡,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一绸吸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧设江,春花似錦惯裕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撑刺。三九已至鹉胖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間够傍,已是汗流浹背甫菠。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冕屯,地道東北人寂诱。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像安聘,于是被迫代替她去往敵國和親痰洒。 傳聞我的和親對象是個殘疾皇子瓢棒,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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