0

android.os.Message には、別のスレッドがメッセージを受信した後に何をすべきかを識別するための多くのフィールドがあります。

public int what;
public int arg1; 
public int arg2;

ただし、メッセージをメッセージ キューに入れた後でフィールドの値を変更すると、受信側スレッドがメッセージを処理する方法に影響します。

Android チームが android.os.Message を不変にしないのはなぜですか? Android 開発者がミスを犯すのを防ぐことができると思います。

不変にする方が良い設計ではないでしょうか。

4

1 に答える 1

2

最初の質問に対する正確な答えはありません (Android チームだけが持っています)。どうやら、メモリ/パフォーマンスの考慮事項に関連しているようです。一般に、オブジェクトの作成には非常にコストがかかるため、Androidは次のように提案しています。

これらのいずれかを取得する最善の方法は、 Message.obtain() または Handler.obtainMessage() メソッドの 1 つを呼び出すことです。これにより、再利用されたオブジェクトのプールからそれらが取得されます。

Android リファレンスに従って Message.obtain() を使用すると、新しい Message オブジェクトの作成に時間とメモリを費やすことはありませんが、「メッセージ クエリ」から既存のものを再利用します。Android はリソースが制限されたモバイル システム用であるため、Message は変更可能になったと思います (今日の時点で有効かどうかはわかりませんが、数年前のことです)。

同時に、不変オブジェクトには多くの利点があります。詳細については、Effective Java Item 15: Minimize Mutability を参照してください。不変クラスを使用する主な理由は次のとおりです。

  • 不変オブジェクトは単純です。
  • 不変オブジェクトは本質的にスレッドセーフです。同期は必要ありません。
  • 不変オブジェクトは自由に共有できます。内部 (通常は final) を共有することもできます。
  • 不変オブジェクトを使用して他のオブジェクトを構築する方が簡単です。

効果的な Java は、不変クラスの欠点を 1 つだけ言及しています。それは、個別の値ごとに個別のオブジェクトが必要になることです。

于 2012-06-30T12:48:28.157 に答える