2011-02-02 10 views
0

私はBlackberryアプリケーションをリファクタリングしていますが、私は現在グローバル変数を使用していると思うシナリオがありますが、それが正しいのかどうかはわかりません。簡単には、私のシナリオは以下の通りです。 -Blackberryアプリケーション設計の質問 - シングルトン

私のアプリは、まずユーザーにログインする必要があります。 (uid、pass)は、ログインが有効かどうかを判断して追加のデータを返すWebサービスに送信されます。 (正常に呼び出してログインした後)

class UserDataModel 
{ 
    private String username; 
    private String password; 
    private String fullName; 
    private String age; 
    ... 
    /* Getters and Setters */ 


} 

は、私はまた、ユーザーが保存したすべての設定が含まれているUserPreferencesModelを持っている - 私はこのようになります私のアプリケーションのモデルオブジェクトを持っています。 (私はそれらをデータベースにバックアップし、デバイス間で復元する必要があります)

さらに、一般的にどのような状況でモバイル開発のコンテキストで使われているのですか?

ありがとう、
Teja。

+0

であることことを願っていますので、おそらくあなたがするかどうかの話をしている簡単な例を作りました静的なフィールドを使用して対シングルトンを介してアクセスするか? –

+0

はい、静的フィールドを使用しています。 –

答えて

-1

静的変数を持つときのシナリオがあります。 Constant Stringフィールドと同様です。

ここにブラックベリープラットフォームのための効率的なコードを書くためのブラックベリー公式ベストプラクティスドキュメントへのリンクです。

Black Berry: Best Practices: writing efficient code

1

シングルトンを使用する点でブラックベリーについて特に特別なことは何もありません。もちろん、真の定数は静的なものでなければなりません。そしてそれらのすべてが最終的なものでなければならないが、ストリング:static final Stringがあなたのコードで頻繁に再利用されるならば、メモリ使用のペナルティがある。

シングルトンは、単一の制御ポイントで比較的寿命の長い複雑なモデルを置き換えたり削除したりすることができます。 あなたの例では、DataModelが良い候補です。 BlackBerryは個人用のデバイスなので、ユーザープロファイルを持つこのDataModelと、おそらく追加のデータが、アクティブなアプリケーションの存続期間中存続する可能性があります。 だから、それを行うための

class UserDataModel 
{ 
    private static UserDataModel singleton; 

    public static void login() { 
     //get credentials 
     //authenticate 
     singleton = new UserDataModel(... user profile data...); 
    } 

    public static UserDataModel getInstance() { return singleton; } 

    private String username; 
    private String password; 
    private String fullName; 
    private String age; 
    ... 
    /* Getters and Setters */ 


} 

この方法は有効で、少し単純化され、一例です。何かが変わった場合(例えば、サーバーホスト)、シングルトンを置き換えるだけです。また、UserDataModelの実装がサーバーごとに異なる場合は、多態性を使用する可能性があります。アクセサーのチェーン内に余分な変数が1つあれば、多くの利点があります。ここでもまた、BlackBerryについて特別なことは何もない。この理由は、Javaアプリケーションでは有効である。

なぜ例が単純化されるのは、スレッドについて考える必要があるからです。たとえどこかでlogin()とは別のスレッドでgetInstance()にアクセスする可能性がある場合は、それらを適切に同期させる必要があります(単純なオブジェクト参照を、別のBlackBerryのスレッド)。

2

まあ、私はRuntimeStoreの使い方をすることができます、私は、Javaにはグローバルはありませんこれは便利

public class myData 
{ 
long ID = 0xf46f5a7867d69ff0L; 
String d1; 
RuntimeStore runTS = RuntimeStore.getRuntimeStore(); 

public void setData(String _d1) 
{ 
    try 
    { 
     syncronized (runTS) 
     { 
      runTS.put(ID, _d1); 
     } 
    }catch(Exception ex){} 

} 

public String getData() 
{ 
    String s; 
    try 
    { 
     s = (String)(RuntimeStore.getRuntimeStore().get(ID)); 
    }catch(Exception ex){} 
    return s; 
} 
}