2016-08-24 2 views
2

スタンドアントアンドロイドクラスstatic final intでは、異なるフラグを表すためにvarsが使用されます。例えば、visabilityフラグを見る:なぜstatic final intがenumを避けるアンドロイド標準クラスで使用されていますか?

/** @hide */ 
@IntDef({VISIBLE, INVISIBLE, GONE}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface Visibility {} 

/** 
* This view is visible. 
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code 
* android:visibility}. 
*/ 
public static final int VISIBLE = 0x00000000; 

/** 
* This view is invisible, but it still takes up space for layout purposes. 
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code 
* android:visibility}. 
*/ 
public static final int INVISIBLE = 0x00000004; 

/** 
* This view is invisible, and it doesn't take any space for layout 
* purposes. Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code 
* android:visibility}. 
*/ 
public static final int GONE = 0x00000008; 

/** 
* Mask for use with setFlags indicating bits used for visibility. 
* {@hide} 
*/ 
static final int VISIBILITY_MASK = 0x0000000C; 

private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; 

開発者はこのケースでenumの使用を避けるのはなぜ?

+0

コードがJava 5よりも先行しているか、開発者が静的な 'int'を使用することを選択しました。 –

+1

@ElliottFrisch時々、ビットバイディングが理由です。しかし、大きな理由はperfです。enumはパフォーマンスのためにひどく実装されています。 –

答えて

0

他の人が言っているように、パフォーマンスのために主に行います。パフォーマンスの主な影響は、使用するメモリ量です。

私はこれが(馬の口から)問題に関する最適なリソースであると感じ https://youtu.be/Hzs6OBcvNQE

私はビデオがSOにここに珍しいです知っているが、それは問題の点リソースへの最もです。

サイドポイント: Enumはパフォーマンスが最適化されていませんが、Progaurdを使用してコンパイル時にすべての列挙型をstatic final intに変換すると、Androidスタジオで行われるほとんどのアプリケーションは問題ありません。私はEnumsがもう少し表情豊かであると感じるので、これを行います。

+0

@ChiefTwoPencils Fixed –

-2

enumは高価です。まず、文字列です。これは、2つを比較することは文字列比較でint比較ではないことを意味します。これはコストの何倍にもなります。第二に、それらはオブジェクトです。 RAMが限られているデバイス上にたくさんの小さなオブジェクトを作成することは、フラグメンテーションのためにOOMを実行するのに最適な方法です。各割り当てには時間がかかります。そのようなものとして、彼らはパフォーマンスのために恐ろしいです。

実際にJavaは列挙型を設計したときに犯されました。オブジェクトや文字列であってはなりません。サーバー側のパフォーマンス指向のコードでさえ、intを優先してそれらを回避します。

+0

"まず、文字列です" - いいえ、Javaクラスです。 "これは、2つを文字列比較とint比較で比較することを意味します" - いいえ、オブジェクトIDの比較です。 「限られたRAMを持つデバイス上に小さなオブジェクトをたくさん作成することは、断片化のためにOOMに移行する素晴らしい方法です。各割り当てには時間がかかります」 - 実際、enum自体のインスタンスをたくさん作成することはパターンではなく、 enum自体。これは、他のクラスと大きく異なるわけではありません。そのクラスのインスタンスをたくさん作成することは、アンチパターンです。 – CommonsWare

+0

賢明であるためには、はい、文字列変数メンバーを持つクラスです。残りのポストは変更されません。彼らは恐ろしいデザインの決定であり、それらを使用することは反パフォーマンスです。サンは戸惑いました。 –

+0

[Joshua Bloch](https://twitter.com/joshbloch/status/628663950389841920)は、実際にこの記事の一部を書いていますが、あなたに同意しません。 – CommonsWare

関連する問題