摘要:比如顯然,此時(shí)就未能實(shí)現(xiàn)賦值的類型檢查,也未能把多個(gè)枚舉值歸納到同一個(gè)枚舉類型下。強(qiáng)行的實(shí)現(xiàn)會(huì)變的極為尷尬此時(shí),在枚舉值較少的時(shí)候還能忍,較多的時(shí)候代碼就會(huì)變得非常丑陋。
前述
曾經(jīng)有一段時(shí)間,許多網(wǎng)上的 Android 性能調(diào)優(yōu)的文章都提到,要盡量避免在 Android 中使用 enum,因?yàn)槭褂?enum 會(huì)引入較大的性能損失。
然而,最新的 Android 文檔已經(jīng)改變了這一說(shuō)法。根據(jù) Android VM 的開(kāi)發(fā)者Elliot Hugues 的博客所述,過(guò)去的 Android 官網(wǎng)的性能優(yōu)化指南并不準(zhǔn)確,混雜了許多臆斷。因此如今他們嚴(yán)格地依據(jù)事實(shí),重寫了Android 性能優(yōu)化指南,開(kāi)發(fā)者也應(yīng)當(dāng)以最新的文檔為準(zhǔn)。當(dāng)然比較窘迫的是,Android 文檔的更新并不是同時(shí)改口,事實(shí)上就在同個(gè) training 目錄下的 管理應(yīng)用內(nèi)存一文中,就仍然保留了過(guò)時(shí)的避免使用 enum 的說(shuō)法。
最新的解釋之所以重新鼓勵(lì)使用 enum ,其解釋是:
Android 2.2 及以下系統(tǒng)上,使用 enum 的確會(huì)引發(fā)較大的性能損耗。主要是內(nèi)存上的消耗,enum 遠(yuǎn)大于使用 static final int。
在 Android 2.3 及以后的系統(tǒng)中,之前的一些 enum 的性能問(wèn)題已被 JIT 所優(yōu)化。此時(shí),雖然 enum 相比于 static final int,內(nèi)存仍然有所增加,但已經(jīng)是可以接受的了。加之 Android 2.2 到如今的 Android 7.0,Android 手機(jī)的內(nèi)存配置突飛猛進(jìn),從256MB躍升至6GB,enum 所帶來(lái)的內(nèi)存增加已經(jīng)可以忽略。
強(qiáng)內(nèi)存依賴的應(yīng)用的枚舉實(shí)現(xiàn)盡管如此,在實(shí)際開(kāi)發(fā)中仍然有可能遇到內(nèi)存消耗較大的應(yīng)用開(kāi)發(fā)問(wèn)題,那么此時(shí),該如何優(yōu)化枚舉值的實(shí)現(xiàn),以節(jié)約內(nèi)存消耗呢?方案如下:
直接使用 static final int然而,其問(wèn)題在于,直接使用無(wú)法實(shí)現(xiàn)枚舉變量賦值的類型安全。且無(wú)法把多個(gè)枚舉值歸納到同一個(gè)枚舉類型下。比如:
private static final int MONDAY = 0; private static final int TUESDAT= 1; private static final int WEDNESDAY = 2; private static final int THURSDAY = 3; private static final int FRIDAY = 4; private static final int SATURDAY = 5; private static final int SUNDAY = 6; private static final int JANUARY = 7; private int day = JANUARY;
顯然,此時(shí) int 就未能實(shí)現(xiàn)賦值的類型檢查,也未能把多個(gè)枚舉值歸納到同一個(gè)枚舉類型下。
Android Proguard 優(yōu)化在 Android Proguard 中,可以在 proguard.cfg 中加入?yún)?shù) -Doptimization class/unboxing/enum,從而自動(dòng)將 enum 替換為 static final int。這樣,也就無(wú)需擔(dān)心多余的內(nèi)存問(wèn)題了。
使用 IntDef 注解替代 intIntDef 可以用于替代 int,其價(jià)值在于用@IntDef int var限定賦值范圍,實(shí)現(xiàn)類型安全。還用 @IntDef({SUNDAY, MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY})歸集了散亂的 static final int 變量,如下代碼所示:
public class MainActivity extends Activity { public static final int SUNDAY = 0; public static final int MONDAY = 1; public static final int TUESDAY = 2; public static final int WEDNESDAY = 3; public static final int THURSDAY = 4; public static final int FRIDAY = 5; public static final int SATURDAY = 6; @IntDef({SUNDAY, MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}) @Retention(RetentionPolicy.SOURCE) public @interface WeekDays {} @WeekDays int currentDay = SUNDAY; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setCurrentDay(WEDNESDAY); @WeekDays int today = getCurrentDay(); switch (today){ case SUNDAY: break; case MONDAY: break; case TUESDAY: break; case WEDNESDAY: break; case THURSDAY: break; case FRIDAY: break; case SATURDAY: break; default: break; } } public void setCurrentDay(@WeekDays int currentDay) { this.currentDay = currentDay; } @WeekDays public int getCurrentDay() { return currentDay; } }
然而,IntDef 的缺點(diǎn)在于無(wú)法優(yōu)雅地把 int 轉(zhuǎn)為 IntDef,尤其在一個(gè)枚舉值是服務(wù)端下發(fā)的時(shí)候。強(qiáng)行的實(shí)現(xiàn)會(huì)變的極為尷尬:
@WeekDays public int getDay(int value) { switch (value){ case 0: return SUNDAY; case 1: return MONDAY; case 2: return TUESDAY; case 3: return WEDNESDAY; case 4: return THURSDAY; case 5: return FRIDAY; case 6: return SATURDAY; }
此時(shí),在枚舉值較少的時(shí)候還能忍,較多的時(shí)候代碼就會(huì)變得非常丑陋。本質(zhì)是因?yàn)?,@IntDef 缺少像 Enum.values() Enum.ordinal() 等等 int 與 enum 與 String 互轉(zhuǎn)的方法,因此在想換轉(zhuǎn)換較多的場(chǎng)景下,不如采取第二種優(yōu)化方法。
====================================
如果您覺(jué)得我的文章對(duì)您有所啟迪,請(qǐng)點(diǎn)擊文末的推薦按鈕,您的鼓勵(lì)將會(huì)成為我堅(jiān)持寫作的莫大激勵(lì)。 by DesGemini
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66086.html
摘要:基本語(yǔ)法我們通過(guò)注解的定義來(lái)切入注解的語(yǔ)法。跟定義接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解說(shuō)明了注解所修飾對(duì)象的類型。也就是標(biāo)識(shí)該注解可以被繼承。的內(nèi)置注解重寫了父類的方法表示已過(guò)時(shí),不推薦使用。 在Android開(kāi)發(fā)中我們經(jīng)常會(huì)用到注解,例如@Override Butterknife中的BindView等。這里主要記錄下注解怎么寫和簡(jiǎn)單的使用。...
摘要:不能滿足被回收的條件,盡管調(diào)用也還是不能得到回收這就造成了內(nèi)存泄漏。種解決單例中的內(nèi)存泄漏將引用置為銷毀監(jiān)聽(tīng)使用弱引用將監(jiān)聽(tīng)器放入弱引用中從弱引用中取出回調(diào)通過(guò)第七小點(diǎn)就能完美的解決單例中回調(diào)引起的內(nèi)存泄漏。我們?yōu)槭裁匆獌?yōu)化內(nèi)存 showImg(https://user-gold-cdn.xitu.io/2019/5/12/16aac64e31d8c501); 在 Android 中我們寫的...
閱讀 781·2023-04-25 16:55
閱讀 2821·2021-10-11 10:59
閱讀 2087·2021-09-09 11:38
閱讀 1800·2021-09-03 10:40
閱讀 1495·2019-08-30 15:52
閱讀 1134·2019-08-30 15:52
閱讀 965·2019-08-29 15:33
閱讀 3505·2019-08-29 11:26