最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

一、Int類型注解檢查類型安全

package com.yw.enumproxylib;

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

import androidx.annotation.IntDef;

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


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

  }

  /**
   * 獲取汽車類型
   *
   * @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類型注解檢查類型安全

package com.yw.enumproxylib;

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

import androidx.annotation.StringDef;

/**
 * 定義一個string類型的注解,用于檢查星期的類型安全。
 * 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})//此處定義注解的值只能是這幾個
  @Retention(RetentionPolicy.SOURCE)//編譯時注解,源碼級檢查
  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;
  }
}

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

同理StringEnum也能檢查類型安全。

package com.yw.enumproxy;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

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

/**
 * 測試?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);//此處類型檢查不通過
    int ck = EnumProxy.getCar(EnumProxy.GREEN_CAR);//類型檢查通過


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

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

相關(guān)文章

最新評論

阳新县| 清河县| 科技| 沈丘县| 扶风县| 阿巴嘎旗| 乾安县| 卢湾区| 淳化县| 安阳县| 奎屯市| 剑川县| 义马市| 乌鲁木齐县| 镇赉县| 江门市| 吴桥县| 南江县| 稷山县| 伊川县| 周至县| 浙江省| 葵青区| 乌兰察布市| 雅江县| 泾阳县| 达尔| 普陀区| 上高县| 酒泉市| 故城县| 方山县| 沈阳市| 凤城市| 闵行区| 邵武市| 兴业县| 宜城市| 博爱县| 太和县| 万年县|