2016-01-04 5 views
12

定数を列挙型と比較すると、定数が少なくなり、プリミティブになる可能性があります。私は@Intdef annotationをアンドロイドで研究しています。誰かが@Intdefとenumを使うより良い記憶装置かどうか教えてもらえますか?可能であれば、enumを別に置いて@intdefを使うのがアンドロイドにおすすめですか? @Intdefは多型を行うことができますか?メモリoverheadに関するアンドロイドのドキュメントからenum vs android @Intdef - どちらが最適化されていますか

列挙型は、多くの場合、静的定数として多くのメモリの倍以上を必要とします。 Androidではenumを厳密に使用しないでください。

答えて

18

@Intdefははるかに効率的で、静的な最終整数を持つだけでゼロウェイトです。コンパイル時の指示です。列挙型はクラスであり、あなたのリンクに記載されているように足跡があります。 @Intdefは、列挙型のもっとも基本的な機能、つまり値の検証と、自動文字列変換などの列挙型の他の機能を提供しません。

多くのアンドロイドのドキュメントは古くなっていますが、これは非常によくその1つになる可能性があります。後半はアンドロイドの頃にはすべてのビットがカウントされましたが、現在はデバイスがはるかに優れています。個人的には、デザインによって求められるものに応じてこれらの2つのオプションを選択し、効率的であることに追いつかないようにします。また、これらのより高度な注釈の構文は、クリーンでコードを読みやすくするためのものではありません。しかし、状況が良い古いstatic intを必要とする場合、@Intdefは視覚的混乱を犠牲にして何らかの保護を購入します。私はあなたが(そして、あなたは間違いなくサイズを小さくし、コードを難読化するためにそれを行う必要があります)ProGuardのを使用している場合、それは可能であるところはどこでも、そしてあなたのEnumsが自動的に@IntDefに変換されることを追加することになり、以前の回答に加えて

+4

Proguardの最適化 'class/unboxing/enum'を見てください。 http://proguard.sourceforge.net/manual/optimizations.html –

10

、:

https://www.guardsquare.com/en/proguard/manual/optimizations

クラス/アンボクシング/列挙

簡素化enum型可能であれば、定数を整数にします。したがって

、あなたには、いくつかの離散的な値を持っており、いくつかの方法は、ProGuardのが私のコードを最適化する、このマニュアル作業を行いますので、私は、Enumを使用することになり、これだけの値ではなく、同じタイプの他の人を取ることができるようにする必要がある場合。

そしてhere is Jake Whartonの列挙型の使用についての良い記事を見てください。

ライブラリ開発者は、消費するアプリケーションのサイズ、メモリ、パフォーマンスにできる限り影響を与えたくないため、これらの小さな最適化を認識しています。しかし、HashMapとSparseArrayのようなバイナリ検索されたコレクションを使用し、適切な場合は整数値と比較してパブリックAPIに列挙して、インデックス化されたループとイテレータの割り当てを捨てることを認識することが重要です。違いを知って情報に基づいた意思決定をすることは重要であり、ビデオはこの1つの愚かな統計を除いてほぼ釘付けになっています。

+0

もちろん、「可能な限り」はそれほど意味するものではありません。 –

+0

私は間違っていないと、すべての "シンプル"列挙を変換します。列挙型の中にフィールドまたはメソッドがある場合、変換されません。私はこの説明とのリンクを見つけることができませんが、それは合理的に聞こえる。 – Gaket

関連する問題