[解決済み] Androidでenumを使うのは避けた方が良いですか?
質問
私は以前、次のような関連する定数のセットを定義していました。
Bundle
のような関連する定数をまとめて定義し、以下のようなインターフェースにしていました。
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
これは、関連する定数をまとめて静的import(implementsではない)することで、より良い方法を提供してくれています。私が知っているのは
Android
フレームワークでも同じように
Toast.LENTH_LONG
,
View.GONE
.
しかし、よく感じるのは
Java Enums
は定数を表現するためのより良い、強力な方法を提供します。
を使うのはパフォーマンス的に問題があるのでしょうか?
enums
に
Android
?
少し調べてみると、結局は混乱に陥りました。この質問から
Androidのパフォーマンスのヒントから「Intsしか必要としないEnumを避ける」が削除されましたか?
を見ると、明らかに
Google
が削除されたのは明らかです。
"Avoid enums"
をパフォーマンスのヒントから削除しましたが、公式トレーニングのドキュメントからは
メモリのオーバーヘッドに注意する
のセクションには、はっきりとこう書かれています。
enum は、しばしば静的定数の 2 倍以上のメモリを必要とします。Android では、列挙型の使用は厳に避けるべきです。
これはまだ有効なのでしょうか?(例えば
Java
のバージョン1.6以降)
もう一つ私が観察した問題は
enums
を横切って
intents
を使って
Bundle
シリアライズして送信する必要があります (つまり
putSerializable()
というのは、プリミティブな操作と比較すると、高価な操作だと思います。
putString()
メソッドに比べれば
enums
はそれを無料で提供しますが)。
で同じものを表現するのに最適な方法はどれなのか、どなたか明確にしていただけませんか?
Android
? を使うのは厳に避けるべきでしょうか?
enums
の上に
Android
?
どのように解決するのですか?
使用方法
enum
の機能が必要なときに使います。
避けるべきではありません。
厳しく
.
Java enumの方が強力ですが、その機能を必要としないのであれば、定数を使うのが良いでしょう。
enumを使うべきとき。
- 型チェック - 入力に だけ にリストされた値のみを受け入れることができ、それらは連続したものではありません (以下に私が 連続的 を参照してください)。
-
メソッドのオーバーロード - すべての列挙型定数は、メソッドの独自の実装を持ちます。
public enum UnitConverter{ METERS{ @Override public double toMiles(final double meters){ return meters * 0.00062137D; } @Override public double toMeters(final double meters){ return meters; } }, MILES{ @Override public double toMiles(final double miles){ return miles; } @Override public double toMeters(final double miles){ return miles / 0.00062137D; } }; public abstract double toMiles(double unit); public abstract double toMeters(double unit); }
-
より多くのデータ - あなたの1つの定数は、1つの変数に入れることができない複数の情報を含んでいます。
- 複雑なデータ - 定数がデータを操作するためのメソッドを必要とします。
いつ ではなく を使用します。
- 1つの型のすべての値を受け入れることができ、定数には最もよく使われるこれらの値のみが含まれます。
-
連続したデータを受け取ることができます。
public class Month{ public static final int JANUARY = 1; public static final int FEBRUARY = 2; public static final int MARCH = 3; ... public static String getName(final int month){ if(month <= 0 || month > 12){ throw new IllegalArgumentException("Invalid month number: " + month); } ... } }
- 名前の場合 (あなたの例のように)
- enum を必要としない他のすべてのもの。
列挙型はより多くのスペースを占有する
- 列挙型定数への単一の参照は 4 バイト
- すべての列挙型定数は、以下のような空間を占めます。 そのフィールドのサイズの合計 8 バイトに整列し オブジェクトのオーバーヘッド
- enum クラス自体がある程度のスペースを占有しています。
定数はより少ないスペースしか占めません
- 定数は参照を持たないので、純粋なデータです (たとえ参照であっても、enum インスタンスは別の参照への参照となります)。
- 定数は既存のクラスに追加することができます - 別のクラスを追加する必要はありません。
- 定数はインライン化することができます。これにより、コンパイル時の機能が拡張されます。
関連
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
javaの非静的メソッドを静的に参照することができない
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Jsoup-Crawlingの動作
-
SocketException java.netの4つの例外解決策。
-
java.sql.SQLException: 結果セットの開始前
-
java 365*1000*60*60*24 計算問題
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Androidのパフォーマンスに関するヒントから「Intsしか必要ないEnumは避ける」が削除された理由とは?