9

Android アプリケーションでは、これらの場合に静的フィールドにオブジェクトを格納するのは悪い習慣ですか?

  1. アプリケーションデータ。アプリケーションの実行中にクラス内の静的変数にアプリケーション データを保持するのは悪いことですか? 現在、Applicationクラスのインスタンス変数にデータを格納しています。その後、データを必要とするクラスは からデータを取得できますApplication
  2. Contextなど。静的フィールドにa Context(たとえば、Activityまたはへの参照)を格納するのは悪い習慣ですか? これは、または リソースなどApplicationを必要とするクラスで使用できます。LayoutInflater現在、Context引数としてそれらを必要とするメソッドに s を渡しています。
4

1 に答える 1

18

はい、はい。:)

静的フィールド。Static フィールドを過度に使用すると、多くの問題が発生します。それらは興味深いマージンでアクセスが遅くなるだけでなく、Android によって一晩で破壊される傾向があり、通常、あちこちの参照をチェックしたり、getter/setter をif (sSomeStatic == null) { return new SomeStatic()}. (たとえば) ApplicationData と呼ばれるクラスへの静的参照を保存しても問題ありません。いくつかの値を保存する場所です。時々、いくつかのグローバルが必要ですが、それを悪用するのは簡単なので、新しい Android を検査するたびに眉をひそめます。開発者のソースコード。

はい、Application インスタンスをシングルトン パターンに保存して使用しますが、できるという理由だけで Application 実装に 200 個の静的フィールドを追加しないでください。YOURAPP.getInstance().SomeLazyValueYouAddedHere();

それは悪いことです。これは悪い慣行につながり、ハード参照にアクセスする優れた設計よりも遅くなります。

私は永遠に続けることができますが、これについては StackOverflow で多くの議論が行われています (一部は白熱しています!)。あなたがここにいるのなら、あなたは経験を求めていると思います。私はさまざまなプロジェクトで数年間 Android を使用してきましたが、私の経験では常に、スタティックが少ないほど良いということがわかりました。

今コンテキスト… ああ、コンテキスト。Context をハード参照に保存しないでください。または、メモリリークが発生します。アクティビティには、View やその他のさまざまなものへの参照があります。コンテキストを保存すると、アクティビティが保存され、そこから事態が悪化します。コンテキストを渡す方法を学び、可能な限りアプリケーション コンテキストを使用し、渡す必要がある場合は、非常に正当な理由でそれを行います。ほとんどの場合、アプリ コンテキストはリソースや文字列などを取得するのに十分です。コンテキストを保存する場合は、常にcontext.getApplicationContext();静的なアクティビティ コンテキストを保存しないでください。これもグーグルで検索でき、StackOverflowにはいくつかの良い答えがあります。

Android ブックを 1 冊だけ買う余裕がある場合は、BNRブックを入手してください。Android はときどき新しい SDK をリリースする可能性がありますが、概念は完全に有効であり、作成者が使用するパターンは、アクティビティ、コンテキスト、フラグメントなどを処理する正しい方法です。

更新アプリケーションは次のようになります。

public class YourApp extends Application {
   private static YourApp sInstance;
   public YourApp() {
      super();
      sInstance = this;
   }
   public static YourApp getInstance() {
      return sInstance;
   }
}

その場合、はい、同じアプリ コンテキストへの同じ静的参照を取得しています。

于 2013-11-04T18:17:14.123 に答える