欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開(kāi)銷(xiāo)的方法

 更新時(shí)間:2020年01月31日 10:53:10   作者:飄楊......  
在本篇文章里小編給大家整理的是關(guān)于Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開(kāi)銷(xiāo)的方法和實(shí)例,需要的朋友們參考下。

Java5以后開(kāi)始支持枚舉類(lèi)型,枚舉類(lèi)型使用起來(lái)非常方便,其重要的作用是作為類(lèi)型安全使用的。如果在不考慮系統(tǒng)內(nèi)存開(kāi)銷(xiāo)的情況下大量的使用枚舉也不會(huì)有什么問(wèn)題。但是移動(dòng)端還是需要注意的。

android系統(tǒng)在應(yīng)用啟動(dòng)后會(huì)給應(yīng)用單獨(dú)分配一塊內(nèi)存。應(yīng)用的dex code、heap以及運(yùn)行時(shí)的內(nèi)存分配都會(huì)在這塊內(nèi)存中。而使用枚舉類(lèi)型的dex size是普通常亮的13倍以上。在運(yùn)行時(shí)的內(nèi)存分配,一個(gè)enum的聲明至少要消耗掉20個(gè)bytes。從這兩點(diǎn)就可以說(shuō)明,在app中大量使用枚舉的內(nèi)存開(kāi)銷(xiāo)是非常大的。

枚舉最大的優(yōu)勢(shì)是類(lèi)型安全。那么是不是又辦法在不使用枚舉的情況下做到類(lèi)型安全呢?答案是肯定的,下面看看怎么干。

goodle官方很早就發(fā)現(xiàn)了枚舉對(duì)android系統(tǒng)帶來(lái)的性能開(kāi)銷(xiāo),所以在其官網(wǎng)上就已經(jīng)提醒了開(kāi)發(fā)者盡量少的使用枚舉,而且還提供了注解的方式來(lái)檢查類(lèi)型安全。目前其提供了int和string兩種注解方式。分別是:IntDef和StringDef。

話(huà)不多說(shuō),直接上例子。ps:demo里面有詳細(xì)的注釋。

一、Int類(lèi)型注解檢查類(lèi)型安全

package com.yw.enumproxylib;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import androidx.annotation.IntDef;

/**
 * 定義一個(gè)int類(lèi)型的注解
 * 用注解代替枚舉,做到類(lèi)型安全
 * create by yangwei
 * on 2020-01-30 21:34
 */
public class EnumProxy {
  public static final int READ_CAR = 0;//紅色的汽車(chē)
  public static final int GREEN_CAR = 1;//綠色的汽車(chē)
  public static final int YELLOW_CAR = 2;//黃色的汽車(chē)


  @IntDef({READ_CAR, GREEN_CAR, YELLOW_CAR})
  @Retention(RetentionPolicy.SOURCE)//源碼級(jí)別
  public @interface CAR_Enum {

  }

  /**
   * 獲取汽車(chē)類(lèi)型
   *
   * @param car
   * @return
   */
  public static int getCar(@CAR_Enum int car) {
    switch (car) {
      case READ_CAR:
        return 0;
      case GREEN_CAR:
        return 1;
      case YELLOW_CAR:
        return 2;
    }
    return -1;
  }
}

二、String類(lèi)型注解檢查類(lèi)型安全

package com.yw.enumproxylib;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import androidx.annotation.StringDef;

/**
 * 定義一個(gè)string類(lèi)型的注解,用于檢查星期的類(lèi)型安全。
 * create by yangwei
 * on 2020-01-30 22:04 week
 */
public class StringEnum {

  public static final String MONDAY = "monday";
  public static final String TUESDAY = "tuesday";
  public static final String WENDESDAY = "wendesday";
  public static final String THURSDAY = "thursday";
  public static final String FRIDAY = "friday";
  public static final String SATURDAY = "saturday";
  public static final String WEEKDAY = "weekday";

  @StringDef({MONDAY, TUESDAY, WENDESDAY, THURSDAY, FRIDAY, SATURDAY, WEEKDAY})//此處定義注解的值只能是這幾個(gè)
  @Retention(RetentionPolicy.SOURCE)//編譯時(shí)注解,源碼級(jí)檢查
  public @interface Week {

  }

  /**
   * 獲取日期
   *
   * @param week
   * @return
   */
  public static String getWeek(@Week String week) {
    switch (week) {
      case MONDAY:
        return "星期一";
      case TUESDAY:
        return "星期二";
      case WENDESDAY:
        return "星期三";
      case THURSDAY:
        return "星期四";
      case FRIDAY:
        return "星期五";
      case SATURDAY:
        return "星期六";
      case WEEKDAY:
        return "星期日";
    }
    return null;
  }
}

三、用來(lái)檢查類(lèi)型安全的MainActivity,從下面可以看到,當(dāng)使用EnumProxy.getCar輸入?yún)?shù)的時(shí)候,如果直接輸入一個(gè)整數(shù)則編譯不通過(guò)。當(dāng)輸入我們定義的EnumProxy.GREEN_CAR編譯才通過(guò)。

同理StringEnum也能檢查類(lèi)型安全。

package com.yw.enumproxy;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.yw.enumproxylib.EnumProxy;
import com.yw.enumproxylib.StringEnum;

/**
 * 測(cè)試?yán)?
 */
public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    int car_black = 10;
    int bk = EnumProxy.getCar(car_black);//此處類(lèi)型檢查不通過(guò)
    int ck = EnumProxy.getCar(EnumProxy.GREEN_CAR);//類(lèi)型檢查通過(guò)


    String str = "friday";
    String week1 = StringEnum.getWeek(str);//直接賦值String時(shí)類(lèi)型檢查不通過(guò)
    String week2 = StringEnum.getWeek(StringEnum.FRIDAY);//賦值定義好的值時(shí)類(lèi)型檢查通過(guò)
  }
}

以上知識(shí)點(diǎn)如果大家在學(xué)習(xí)的時(shí)候有任何疑問(wèn)可以聯(lián)系腳本之家小編補(bǔ)充分享。

相關(guān)文章

  • Kotlin中的handler如何避免內(nèi)存泄漏詳解

    Kotlin中的handler如何避免內(nèi)存泄漏詳解

    Handler,我們已經(jīng)相當(dāng)熟悉了,而且經(jīng)常用得不亦樂(lè)乎,但就是因?yàn)樘煜ち?,才?huì)偶爾被它反捅一刀,血流不止,下面這篇文章主要給大家介紹了關(guān)于Kotlin中handler如何避免內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • Android SharedPreferences實(shí)現(xiàn)記住密碼和自動(dòng)登錄

    Android SharedPreferences實(shí)現(xiàn)記住密碼和自動(dòng)登錄

    這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences實(shí)現(xiàn)記住密碼和自動(dòng)登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android實(shí)現(xiàn)圖片加載進(jìn)度提示

    Android實(shí)現(xiàn)圖片加載進(jìn)度提示

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片加載進(jìn)度提示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Android自定義View實(shí)現(xiàn)黑客帝國(guó)數(shù)字雨效果

    Android自定義View實(shí)現(xiàn)黑客帝國(guó)數(shù)字雨效果

    這篇文章主要給大家介紹了關(guān)于Android自定義View實(shí)現(xiàn)黑客帝國(guó)數(shù)字雨效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Android UI控件之ProgressBar進(jìn)度條

    Android UI控件之ProgressBar進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android UI控件之ProgressBar進(jìn)度條的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android OkHttp的簡(jiǎn)單使用和封裝詳解

    Android OkHttp的簡(jiǎn)單使用和封裝詳解

    這篇文章主要介紹了Android OkHttp的簡(jiǎn)單使用和封裝詳解的相關(guān)資料,Android OKHttp的簡(jiǎn)單get、post的使用,再到它的封裝,需要的朋友可以參考下
    2016-12-12
  • RecyclerView自定義分割線

    RecyclerView自定義分割線

    這篇文章主要為大家詳細(xì)介紹了RecyclerView自定義分割線的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Android自定義評(píng)分控件的完整實(shí)例

    Android自定義評(píng)分控件的完整實(shí)例

    在Android開(kāi)發(fā)中,我們經(jīng)常會(huì)用到對(duì)商家或者商品的評(píng)價(jià),運(yùn)用星星進(jìn)行打分,下面這篇文章主要給大家介紹了關(guān)于Android自定義評(píng)分控件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Taro打包Android?apk過(guò)程詳解

    Taro打包Android?apk過(guò)程詳解

    這篇文章主要為大家介紹了Taro打包Android?apk的過(guò)程及詳解步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • Flutter 自定義Drawer 滑出位置的大小實(shí)例代碼詳解

    Flutter 自定義Drawer 滑出位置的大小實(shí)例代碼詳解

    這篇文章主要介紹了Flutter 自定義Drawer 滑出位置的大小,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論