2011-12-28 15 views
0

私のアプリケーションにいくつかのデータを保管する必要があります。 私はこのようにそれを行うことができることを知っている:Android - グローバル変数?

クラス:

public class MyApplication extends Application { 

    private String someVariable; 

    public String getSomeVariable() { 
     return someVariable; 
    } 

    public void setSomeVariable(String someVariable) { 
     this.someVariable = someVariable; 
    } 
} 

実装:私は活動にいる場合、これが動作している

MyApp appState = ((MyApp)getApplicationContext()); 
String state = appState.getSomeVariable(); 

私はアクティビティから拡張されていないクラスにいる場合、どのように私のデータにアクセスできますか?

ご協力いただきありがとうございます。

答えて

1

おそらく、クラスデータに必要なものすべてをコンストラクタまたは特別なセッタを介して注入することによって、私は前者を提案します。 (Constructor Injection vs. Setter Injection

静的なフィールドのような解決策がありますが、個人的には静的な方法では単体テストがちょっと乱雑になることがあるので、私はこのアプローチが嫌いです。

ところで、どのような変数を共有したいですか?

0

私はこれを使用すると、アプリのすべてのクラスから取得できる、静的変数を持つクラスにはぎこちないかもしれません。

すべてのフィールドが静的であるクラスを作成するだけで、アプリ全体で使用できます。アプリを停止するときにだけ消去されません。

アプリケーションクラスに静的変数を追加することもできます。

+2

Iをなぜ一部の人々が原則的に静電気防止されているのかよく分かりません。静的な理由で言語に存在します。いくつかのパターン(シングルトンのようなもの)はそれらを使用します。 –

+0

私は信じているのは、非常に多くの理由が理由で使用されており、あらゆる場所にフィールドにアクセスする能力を活用するだけだからです。 – sll

0

静的メソッド(または変数が公開されている場合)を使用できます。それは本当に少し厄介ですが、どこにでもアプリの使用中

int x=MyApplication.getSomeInt(); 

ところで、あなたのグループにそれらあなたがhappinnesと満足を獲得できます正しい方法で(メソッド))

static public int getSomeInt(){ 
    //something 
} 

あればこのスタイルを使用すると、Applicationクラスを拡張する必要はありません。そのような目的のために抽象クラスを作成する方が良いでしょう。あなたはシングルトンデザインパターンを使用することができます

+1

また、スレッドセーフではなく、メソッドを同期させてください。 – NikkyD

5

。静的なアクセス権があるため、どこでも使用できます。その後、

public class SingletonClass { 
private static SingletonClass _instance = null; 
private int _value = 0; 

private SingletonClass() { 
} 

public static SingletonClass getInstance() { 
    if (_instance == null) 
     _instance = new SingletonClass(); 
    return _instance; 
} 

public int getValue() { 
    return _value; 
} 

public void setValue(int value) { 
    _value = value; 
} 

}

と、このようにアクセス:

SingletonClass.getInstance().getValue(); 

注:これは、いくつかのプログラミングの問題のために良いと簡単な回避策ですが、非常に賢明にそれを使用。..それは

+2

警告、これはスレッドセーフではありません! – NikkyD

+0

これは本当ですが、質問の範囲外です。私は簡単な回避策をスレッドセーフにするために働くと信じています:必要に応じてlock()を追加する) –

+1

シングルトンは間違った方法で使用され、特別な場合を除いて慎重に使用してください。 – sll

0

は、メソッドやクラスへのparamとして、あなたの活動のコンテキストを渡すことの問題が付属しています:あなたの活動に、

// ... 
public void doStuff(Context context) { 
    // for example, to retrieve and EditText 
    EditText et = context.findViewById(R.id.editText1); 
} 

そして、あなたはどうなる:

// ... 
MyClass myClass = new MyClass(); 
// ... 
myClass.doStuff(this); 
// ...