成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

enum、static final 與 IntDef:Android 中實(shí)現(xiàn)枚舉的方案選擇

yuanzhanghu / 2414人閱讀

摘要:比如顯然,此時(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 注解替代 int

IntDef 可以用于替代 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

相關(guān)文章

  • 進(jìn)擊Android工程師之Java基礎(chǔ): 注解

    摘要:基本語(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)單的使用。...

    muddyway 評(píng)論0 收藏0
  • 性能優(yōu)化(三)看完這篇文章,至少解決 APP 中 90 % 內(nèi)存異常問(wè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 中我們寫的...

    Elle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<