2010-12-27 16 views
7

、私はいくつかの方法怒鳴る見ないでください はActivity.javaのソースコードは、内部ゲッター/セッター

public Window getWindow() { 
    return mWindow; 
} 

しかし、次のルールなど

内部ゲッター/セッターを避け

C++などの母国語では、 ゲッターを使用する一般的な方法(例:直接フィールドにアクセスするのではなく(i = mCount)、代わりにフィールドに直接アクセスするのではなく(i = getCount())コンパイラが通常 のアクセスをインラインでインライン化し、 のデバッグフィールドへのアクセスを制限する必要がある場合は、 のコードをいつでも追加することができるので、 はC++の優れた習慣です。

Androidでは、これは悪い考えです。 仮想メソッド呼び出しは、 インスタンスフィールド ルックアップよりもはるかに高価です。 共通オブジェクト指向プログラミング を実践し、ゲッターとセッターをパブリックインターフェイスで にするのは合理的ですが、 クラス内では常にフィールド に直接アクセスする必要があります。

JITがない場合、 は、 トリガーゲッターを呼び出すよりも約3倍高速です。 JIT( 直接フィールドへのアクセスは、 ローカルにアクセスする場合と同じくらい安い)では、ダイレクトフィールド へのアクセスは、簡単なゲッターを呼び出す よりも約7倍高速です。これはFroyoでは に該当しますが、今後 ではJITインラインゲッター メソッドが改善されます。

このアンドロイドの開発者がこのmWindowオブジェクトに直接アクセスしない理由を知りたいのですが?現在のアンドロイドバージョンのJITがアクセスをインライン化できない場合、getWindow()。findViewById(id)はmWindow.findViewById(id)よりも時間がかかり、findViewByIdはかなり頻繁に使用されるメソッドです。

答えて

1

mWindowプロパティに直接アクセスすることはできません - it's private。 メソッドでレイアウト内のすべてのビューに対して1回呼び出すだけで、アクティビティのメンバーにビューを保存する必要があるため、findViewByIdの速度には気にしません。あなたを行うビューごとに一度だけfindViewByIdを呼び出しますか?あなたが本当にこれらの事を心配している場合;-)

しかし、あなたは、自分のためgetWindow()を呼び出すローカル変数にそれを格納し、直接それにfindViewByIdを呼び出すことができます。私はこれをお勧めしません。なぜなら、ここでのパフォーマンスの向上は時間がかからず、とにかく将来のバージョンのJITでは時代遅れになるからです。

これを行うと、保存したマイクロ秒の量に非常に関心があります。 :-)

+0

感謝。あなたが言ったように私は確かに各ビューのfindViewByIdを呼び出します。たぶん私は原則を誤解しているかもしれませんが、今は明らかです。 – teok

2

まず、プライベートであるためアクセスできません。

なぜプライベートですか?

あなたが言ったように、メンバーに直接アクセスする方が高速です。一方、ビュー階層内のいくつかのビューを検索するので、あまり速くないメソッドを呼び出すことになります。したがって、直接アクセスの代わりにメソッドを使用すると、そのタスクを実行するのに要する合計時間のパーセンテージの観点から小さなオーバーヘッドが発生します。

とにかく、私はこれがカプセル化であると信じています。

は、(これはAndroid SDK)ではないものを呼び出しています。だから、あなたは何が起こっているのかを "反対側で"推測するべきではありません。単にこのメソッドを使用し、必要なビューを返すことを期待してください(存在しない場合はnull)。

次のバージョンのAndroidでは、getWindow()を呼び出すのではなく、別の方法でビューを検索します。このメソッドを使用すると、メソッド(Google/Android)はメソッドを非推奨とマークし、呼び出しを最新の実装に「転送」することができます。 getWindow()に直接電話していた場合は、もはやそこに置かれていないものを探しているかもしれません。

+0

ビューメンバーを評価するために、常にgetWindow()を呼び出す必要はありません。それにもかかわらず、私たちはアンドロイド・アピスの顧客です。私はなぜ彼らがこのようなコードを書いたのか、知りたいのですが、これはどうしても価値があります。あなたの答えをありがとう。 – teok

+0

あなたは私を正しく理解していませんでした。 gigerbreadでは、findViewはウィンドウオブジェクトのどこかに格納された情報を使用するかもしれません。 Honeycomb googleは、ビュー階層システムを変更し、対応する情報を他の場所に保存し、他のデータ構造を使用して別の形式で保存することもできます。直接ウィンドウを使用すると、新しいバージョンでは機能しません。 findViewを使用すると、Googleは新しい実装を呼び出すことができます。さらに詳しい情報:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) –

+0

私の最後のリンクはhttp://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming%29)にする必要があります。 –

0

現在笑顔理由を...持って

すぐに、おそらくprogruardはインライン化アクセサのの細かい仕事をしてジンジャーブレッドプラットフォームに追加された変更された内部ゲッターとセッターを避けるために言うアンドロイドドキュメント、してください"Avoid Internal Getters/Setters" is bad adviceとこれら2つのSOの投稿を参照してください。あなたが答えるため

  1. https://stackoverflow.com/a/6716573/892055

  2. https://stackoverflow.com/a/4930538/892055

関連する問題