簡単に言うと、android.os.Bundleクラスのクローン実装をそのクラスに対してテストして、どちらが優れているかを確認したいと思います。自分のバージョンがもっと悪くなる可能性があることはすでに知っていますが、どれだけ悪くなるか知りたいです。どのオブジェクトがメモリ内で大きいか、および/または値の保存/取得に時間がかかるかを確認するために使用できるAndroid用のベンチマークツールはありますか?
TL; DR:
android.os.Bundleクラスのソースコードを調べましたが、オブジェクトを保存して返す方法が好きではありません。それらをに格納し、ClassLoaderを使用しHashMap<String, Object>
て要求されたオブジェクトのクラス(getString()
またはなど)にキャストするだけです。getInt()
これ、またはそのことに関するクラスのキャストは、型の安全性に違反し、静的型付けが防止しようとしているプログラミングレベルでのあいまいさをもたらすと思いますが、そうではありませんか?
型安全性に違反せず、あいまいさを導入しない、同様のデータコンテナクラスを作成したいと思います。論理的に単純ですが明らかに非効率的な方法は、保存したいクラスごとにマップを作成することです。
私が決めたのは、HashMap<String, Integer>
保存したい各クラスのリストの品揃えのキーインデックスマッピングを含むシングルでした。たとえば、を呼び出すとgetString(String key)
、そのキーに関連付けられている整数インデックスが存在する場合はマップから取得し、関連付けられているのそのインデックスにあるオブジェクトを取得しようとしますArrayList<String>
。
ここでの唯一のあいまいさは、null
(そのクラスのリストにインデックスが存在しない場合)または正しいクラスの間違ったオブジェクト(マップされたインデックスは存在するが、そのキーで保存された元のオブジェクトが別のリストにある場合)を返すことです。 、これは実際にチェックするプログラマーの責任です。
このクラスのオブジェクトは一時的なコンテナであり、標準化された方法である場所から別の場所にデータを送信するために使用されます。彼らは固執することを意図していません。また、バンドルと同じように使用されるわけではありませんが、このような統合データコンテナーが必要な理由の一部は、、、、またはその逆に簡単に変換できるようにするためBundle
です。JSONObject
ContentValues
Cursor
あるいは、本当の問題は、キャストが本当にひどいのか、それともそれを回避するために極端な努力をするだけなのかということです。どちらの場合も、あいまいさを回避する唯一の方法は、優れたプログラミングだと思います。
アップデート:
Bundleは、Parcelから自身を解凍するときにのみクラスローダーを使用するように見えますが、put()を呼び出すたびにunparcel()を呼び出します。取得するときは、メソッドが返す型にキャストするだけで、のtry-catchブロック内にありClassCastException
ます。それはおそらくそれを行うための最も簡単な方法です。