2012-06-03 15 views
5

私はAndroidアプリを開発しています。私が書いている方法は、何度も呼ばれるかもしれません。このメソッドでは、ユーザーインターフェイスの更新を行っています。メモリの使用とパフォーマンスは私にとって重要です。私はそれを見て、私はUIを変更するための2つのオプションがあります。Java:グローバル変数はメモリや時間を節約しますか?

最初は、毎回新しいオブジェクトを作成することです。

public void myMethod(){ 
new View().makeVisible(); 
} 

第二は、グローバル変数としてオブジェクトを宣言し、この方法でそれを参照することです:それは何かのように言うことです。これは次のようになります。

View myView = new View(); 

public void myMethod(){ 
myView.makeVisible(); 
} 

明らかに、この方法ではわずか数回呼び出すだけでは差は小さくなります。しかし、これを何回も呼び出す可能性があり、このように多くの変数が呼び出されたり作成されたりすると、2番目の方法でパフォーマンスが向上しますか?

+0

インスタンスを再利用しますか? – SLaks

+0

私はすることができますが、私も持っていません – Flynn

+1

時間/スペースの節約は10倍のコストで打ち負かされます。 –

答えて

2

他の回答に示されているように、メソッド呼び出しごとに新しいインスタンスを繰り返しインスタンス化するのではなく、同じオブジェクトを再利用すると、メモリ使用量が削減され、ガベージコレクションに関してパフォーマンスが向上します。

しかし、私は実際に保守性についてまず考えます。同じオブジェクトを再利用すると、コードがはるかに複雑になります(また、バグが潜在的に発生する可能性があります)。プログラムするときに効率を念頭に置いておくことは良いことですが、プロジェクトを複雑にして開発を遅らせる早すぎる最適化は避けてください。

パフォーマンスとメモリ使用量が懸念ている場合は、はい、それは同じViewを再利用するためにあなたの利益になる:

final View myView = new View(); //made final because it shouldn't be reassigned 

あなたが本当に心のリソースを取得したい場合は、あなたも怠惰な、読み込むことができますつまり、必要なときにすぐ作成してください。しかし、私は手コーディングその振る舞いをするのではなく、このの世話をするためにグアバのSuppliers.memoize(Supplier)を使用することをお勧めします。しかし、この特定の状況のた​​めに、おそらく極端だ

final Supplier<View> myViewSupplier = Suppliers.memoize(new Supplier<View>() { 
    @Override 
    public View get() { 
     return new View(); 
    } 
}); 

... 

public void myMethod() { 
    View myView = myViewSupplier.get(); //lazy-loads when first called 
    myView.makeVisible(); 
} 

を。

0

グローバル変数がより効率的です。

新しいオブジェクトを作成すると、ビューが作成されて古いビューに置き換わるたびに古いオブジェクトがガベージコレクションされるため、新しいメモリオブジェクトが生成されます。同じビューをグローバル変数で再利用すると、新しいオブジェクトを作成して古いオブジェクトを収集するタスクがシステムに保存されます。

編集: グローバル変数はオブジェクトへの参照であり、オブジェクト自体ではありません。

0

すべてのコンストラクタで新しいインスタンスを作成すると、本質的に必ずしも必要ではない作業を再実行しています。私があなたの靴の中にいたならば、私はグローバル変数オプションを持っていて、次にビューをクリアし、可能であれば同じオブジェクトに再描画します。これにより、メモリ割り当ての解除と他の方法による割り当てが繰り返される可能性がなくなります。したがって、新しいビューを継続的に割り当てる価値がある場合は、消去するのが特にコストがかかると思わない限り、拭き取ってください。

同じオブジェクトを再利用するもう一つのインセンティブは、変数がスコープから外れると、アクセスできないJVMに対応するメモリが解放されるという点で、Java仮想マシンの実装がガベージコレクションの使い方と異なります。必ずしも同じではありません。代わりに、多くのビューが順番に割り当てられるインスタンスがありますが、プロセスがアイドル状態になるまで、すべてのプロセスがアロケートされるわけではありません。

1

私は、純粋に効率を上げるべきではないと思います。代わりに、あなたがモデル化しようとしているドメインをどのような構成で表現するのが良いかはわかりません。質問する質問は、「どのクラスがViewを使用するための正しい構造ですか?」です。

インスタンス変数の使用はグローバルではありません。インスタンス変数を宣言しているオブジェクトのコンテキスト内に含まれています。公共の静的変数はかなり近いものの、グローバルはOOに存在するはずではありません。

最初に決定するのは、あなたの "View"インスタンスがそれを使用するクラス/メソッドの意図に対して論理的に属している場所です。それを使用するクラスが何らかのソートのファクトリで、 "myMethod"がファクトリメソッドである場合、yesは新しいインスタンスを返します。

"ビュー"がクラスの論理フィールドであり、何らかの形で状態や動作をキャプチャして強化するのに役立つ場合は、毎回新しいものを作成する必要はありません。単にその状態を維持し、既存のオブジェクトで作業します。

あなたの説明から、ある種のビューの状態を維持して更新しようとしているようです。毎回新しいオブジェクトを作成するのではなく、必要な状態に変更して再表示するのが理にかなっています。機能的には両方のアプローチがあなたのシナリオで機能するように思われるので、私は第2の選択肢を取り、不要なオブジェクトを作成しないようにします。

関連する問題