2013-02-26 15 views
9

最近Android用Javaで開発を開始しました。Java(Android)の静的クラス - 使用または使用しない

私の考えでは、アプリケーションの存続期間開始とストア結果にもののトンをロードする1つの静的クラスを作成することです。

私は活動の間でオブジェクトを共有する方法の多くを読んでいると私は最高の1つの静的クラスを作成することになると思います。どう思いますか?私は別のアプローチを使うべきですか?私はインターネット上で多くの反論を読んだので私は尋ねています。

ありがとうございます。

+0

ベストプラクティスはSharedPreferencesを使用することです。 – Pragnani

+1

@Pragnani共有プリファレンスは、一部の種類のデータに適しています。キー/バリューモデルに適合し、メモリに読み込む時間がかかりません。それはすべての問題に適合しません。 –

+1

*シングルトン*を意味しますか? 「静的クラス」は、そのクラスを囲むクラスのインスタンスを必要としない内部クラスであり、アプリケーション全体のデータを共有することとは関係ありません。 – Wyzard

答えて

16

Wyzardが指摘したように、全く違うもので、静的クラスとは対照的に、私は、あなたが静的フィールドクラスのに言及されたと仮定しています。一般的な経験則として、静的フィールドに情報を保持することは、Javaでは良い考えではありません。この理由は、クラスに格納されているものが何であれ、複数のインスタンスをインスタンス化することができないためです。 Androidアプリケーションの特定の場合には

、アプリケーション自体に関連付けられて格納されたデータを持っていることの問題に対処するための最良の方法は、android.app.Applicationクラスをサブクラス化し、アプリケーション・グローバル・データを処理するためにそれを使用することです:

class FooApplication extends Application 
{ 
    private String privData; 

    public String getPrivData() { 
     return privData; 
    } 
} 

あなたは、このクラスが(代わりにデフォルトApplicationの)メインアプリケーションクラスであることを宣言する必要があります。

FooApplication app = (FooApplication)Context.getApplicationContext(); 
String privData = app.getPrivData(); 

<application android:name="com.example.application.FooApplication" 
      ...> 
    ... 
</application> 

あなたは、あなたのApplicationサブクラスのインスタンスになります方法Context.getApplicationContext()を使用して、アプリケーション内の任意の場所からアプリケーションインスタンスを検索することができます:AndroidManifest.xmlapplicationエントリでは、次の追加

「アプリケーション」のサブクラスを探す場所によっては、「コンテキスト」なしで「getApplicationContext()」を呼び出さなければならない場合があります。

FooApplication app = (FooApplication)getApplicationContext(); 
String privData = app.getPrivData(); 
+0

私は静的なクラスを指していました。さて、このタイプのアプリケーションデータの保存に関するコメントがありますので、私はこのようにします。ありがとうございました。 – Mihalko

2

アンドロイドは限り、あなたのアプリケーションが強制終了されていないとしてgc'edされることはありませんされてApplicationというクラスが用意されています。このクラスを初期化に使用してください。静的クラスはコンテナとしては多少醜いですが、なぜそれがあるのか​​を特定することはできません。

私はそのようなEnumSetsとして表すことができないビットマスクなどの定数のためのコンテナとして使用します。

他の記事ではSharedPreferencesと書かれています。私は、値を保存するための設定があると思っていますが、アプリケーションに必要な構造体をロードすることはできません。これらの構造体は、データのセマンティクスのモデルを表現する構造体からロードする必要があります。

3

あなたの解決策の問題点は、基本的にグローバルの巨大なスタックを作成しているということです。時には避けられないこともありますが、グローバルには常に同じタイプの問題があります。実際には、オブジェクト指向の崩壊が実際にはないコードを読みにくくなります。これを使用することはできますが、実際には多くのアクティビティ間で共有される重要なデータ構造でのみ、控えめに使用してください。

+1

作成または使用するAPIは、最終的に静的な参照になるか、アプリケーションの存続期間中常に存在します。それはどれくらいうまく設計されているかによって異なります。 – ATrubka

関連する問題