摘要:比如顯然,此時就未能實現賦值的類型檢查,也未能把多個枚舉值歸納到同一個枚舉類型下。強行的實現會變的極為尷尬此時,在枚舉值較少的時候還能忍,較多的時候代碼就會變得非常丑陋。
前述
曾經有一段時間,許多網上的 Android 性能調優的文章都提到,要盡量避免在 Android 中使用 enum,因為使用 enum 會引入較大的性能損失。
然而,最新的 Android 文檔已經改變了這一說法。根據 Android VM 的開發者Elliot Hugues 的博客所述,過去的 Android 官網的性能優化指南并不準確,混雜了許多臆斷。因此如今他們嚴格地依據事實,重寫了Android 性能優化指南,開發者也應當以最新的文檔為準。當然比較窘迫的是,Android 文檔的更新并不是同時改口,事實上就在同個 training 目錄下的 管理應用內存一文中,就仍然保留了過時的避免使用 enum 的說法。
最新的解釋之所以重新鼓勵使用 enum ,其解釋是:
Android 2.2 及以下系統上,使用 enum 的確會引發較大的性能損耗。主要是內存上的消耗,enum 遠大于使用 static final int。
在 Android 2.3 及以后的系統中,之前的一些 enum 的性能問題已被 JIT 所優化。此時,雖然 enum 相比于 static final int,內存仍然有所增加,但已經是可以接受的了。加之 Android 2.2 到如今的 Android 7.0,Android 手機的內存配置突飛猛進,從256MB躍升至6GB,enum 所帶來的內存增加已經可以忽略。
強內存依賴的應用的枚舉實現盡管如此,在實際開發中仍然有可能遇到內存消耗較大的應用開發問題,那么此時,該如何優化枚舉值的實現,以節約內存消耗呢?方案如下:
直接使用 static final int然而,其問題在于,直接使用無法實現枚舉變量賦值的類型安全。且無法把多個枚舉值歸納到同一個枚舉類型下。比如:
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;
顯然,此時 int 就未能實現賦值的類型檢查,也未能把多個枚舉值歸納到同一個枚舉類型下。
Android Proguard 優化在 Android Proguard 中,可以在 proguard.cfg 中加入參數 -Doptimization class/unboxing/enum,從而自動將 enum 替換為 static final int。這樣,也就無需擔心多余的內存問題了。
使用 IntDef 注解替代 intIntDef 可以用于替代 int,其價值在于用@IntDef int var限定賦值范圍,實現類型安全。還用 @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 的缺點在于無法優雅地把 int 轉為 IntDef,尤其在一個枚舉值是服務端下發的時候。強行的實現會變的極為尷尬:
@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; }
此時,在枚舉值較少的時候還能忍,較多的時候代碼就會變得非常丑陋。本質是因為,@IntDef 缺少像 Enum.values() Enum.ordinal() 等等 int 與 enum 與 String 互轉的方法,因此在想換轉換較多的場景下,不如采取第二種優化方法。
====================================
如果您覺得我的文章對您有所啟迪,請點擊文末的推薦按鈕,您的鼓勵將會成為我堅持寫作的莫大激勵。 by DesGemini
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66086.html
摘要:基本語法我們通過注解的定義來切入注解的語法。跟定義接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解說明了注解所修飾對象的類型。也就是標識該注解可以被繼承。的內置注解重寫了父類的方法表示已過時,不推薦使用。 在Android開發中我們經常會用到注解,例如@Override Butterknife中的BindView等。這里主要記錄下注解怎么寫和簡單的使用。...
摘要:不能滿足被回收的條件,盡管調用也還是不能得到回收這就造成了內存泄漏。種解決單例中的內存泄漏將引用置為銷毀監聽使用弱引用將監聽器放入弱引用中從弱引用中取出回調通過第七小點就能完美的解決單例中回調引起的內存泄漏。我們為什么要優化內存 showImg(https://user-gold-cdn.xitu.io/2019/5/12/16aac64e31d8c501); 在 Android 中我們寫的...
閱讀 780·2023-04-25 16:55
閱讀 2815·2021-10-11 10:59
閱讀 2078·2021-09-09 11:38
閱讀 1792·2021-09-03 10:40
閱讀 1491·2019-08-30 15:52
閱讀 1131·2019-08-30 15:52
閱讀 960·2019-08-29 15:33
閱讀 3501·2019-08-29 11:26