概要
Enum は、Java で固定定数を含む型です. いくつかの値を事前に定義する必要がある場合は、Enum を使用します. これは通常、コンパイル時に追加の定数を受け入れることによって引き起こされるエラーを回避するために行われます.
さらに、Enum は APK のサイズを増加させ、定数の 5 ~ 10 倍のメモリを使用します。これは、アプリケーション パフォーマンスのベスト プラクティスです。
Enum を使用するデメリット
各列挙値はオブジェクトであり、それを使用すると追加のメモリ消費が増加するため、列挙は整数や文字列よりも多くのメモリを消費します。
Enum をさらに使用すると、DEX ファイルのサイズが大きくなり、実行時のオーバーヘッドが増加し、アプリケーションにより多くのスペースが必要になります。
アプリケーションで Enum を多く使用する場合は、それらの代わりに Integer または String を使用することをお勧めしますが、問題が発生します。
これですべての説明が終わりましたが、これ以上の解決策はありません。
公式ドキュメントによると、静的定数 Enum に比べて 2 倍以上のメモリが必要になるため、Android 開発では Enum (列挙型クラス) を使用しないでください。ここを参照 では
、Enum を使用する必要がある場合はどうすればよいですか?
- 解決
パラメーターの型が一般的すぎて安全ではないため、パラメーターを特定の型セットに制限するだけで済み、@IntDef/@StringDef + @interface を使用してパラメーターを制限します。
使用
1.依存関係をインポートする
implementation 'com.android.support:support-annotations:25.1.0'
2. 定義
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 "包住" 常量;
// @Retention 定义策略
// 声明构造器
@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;
}
}
public class EnumTest {
//定义常量
public static final int RED = 0;
public static final int GREEN = 1;
public static final int YELLOW = 2;
//用 @IntDef "包住" 常量
//定义注解
@IntDef({RED,GREEN,YELLOW})
@Retention(RetentionPolicy.SOURCE)
public @interface Led {}
//定义变量
@Led int red = 5;
//定义方法
@Led
public int getRed() {
return red;
}
}
flag=true 表示可以用条件进行位运算
@IntDef(flag = true, value = {ADD,SUB,MUL,DIV})
違いは、2 番目のタイプは条件付きのビット操作を実行できることです。
要約する
ご覧のとおり、列挙が適用されない場合、型のセキュリティが損なわれます。一般に、便利さと単純さから、多くの場所で列挙型を使用します。ただし、列挙を使用すると、過度のメモリ使用量も発生します。そのため、使用する型の範囲を制限するカスタム ソリューションを使用できます。