2010-12-17 14 views
0

静的属性と静的メソッドを持つPrefs.javaクラスの私のJAVAプロジェクトの設定を提供しています。しかし、OAuth2のトークンは実行時に割り当てる必要があります。これは良い方法ですか...?実行時に静的属性を操作しても問題ありませんか?

public class Prefs { 


    //known before runtime 
    public static final String SERVER_BASE_URL ="http://api.mycompany.com/"; 

    //needs to be set on startup through the setter method 
    private static String token; 


    public static String getToken() { 
    return token; 
    } 

    public static void setToken(String token) { 
    Prefs.token = token; 
    } 

    public static String getXyEndpointUrl() { 
    return SERVER_BASE_URL + "/xy"; 

    } 
} 
+0

コンパイラは最適化しますが、なぜ「XY_ENDPOINT_URL」の最後のフィールドを作成しないのですか? – khachik

+0

OK、次に:public static final String ENDPOINT_XY_URL = SERVER_BASE_URL + "/ xy"; – OneWorld

答えて

3

私はそのようなデザインに対してアドバイスをします。このタイプの静的変数は、グローバル変数よりも優れていません。 This pageには、避けるべき理由がいくつか示されています。ここにいくつかあります。

  • 非局所性
  • ないアクセス制御または制約
  • 暗黙の結合を確認する同時実行が
  • テストと閉じ込め

を発行しかし、のOAuth2のトークンは、する必要があります実行時に割り当てられます。これは良い方法ですか...?

ここでは、このようなトークンをPrefsオブジェクトのコンストラクタに渡したいと思うようです。

+0

私は、Web APIに高レベルのAPIを提供するAndroid用ライブラリを作成しています。 access_tokenを永続性に保存することは私の仕事ではありません。私のlibの実装者はそれを世話する必要があります。しかし、私はまだアクセストークンを格納するのに適した場所を見つけることはできません。実装者のための最も簡単な方法は、Prefs-object – OneWorld

+0

Prefs-objectが私にはうってつしいと思っていました;-)(ただし、静的変数を持つあなたのスキームはPrefs-objectsを全く含まないことに注意してください。) – aioobe

+0

おそらく、インスタンスがないので、私はPrefsクラスと言っていたはずです。だからこの場合(他の人のための図書館)あなたはこのように行くことをお勧めしますか?あなたはPrefsオブジェクトを含まないという意味ですか? – OneWorld

0

通常、実行時にグローバル設定がプロパティファイルから読み込まれます。開発、QA、実稼働環境用にさまざまな設定ファイルを用意することができます。

Webアプリケーションでは、静的変数をWebリクエストから設定すると、セッターを同期させないとデータを破棄することができます。あなたが読んでいるだけなら、あなたは大丈夫でしょう。

システムの認証に関する問題を処理するサービスにOAuthキーを注入しないでください。あなたは静的リソースで行う必要があることを実行することができますが、この場合、キーを保持するために静的変数を必要としないことに注意してください。

+0

私は既に自分のHttpClientのメソッドを上書きしているので、access_tokenが "注入"されるか、URLに追加されるようになります。しかし、TokenizedHttpClient.getInstance()。setToken( "gqwertz"); Prefs.setToken( "fghj")に比べてひどいです。私のlibの実装者のために(また、aioobeの答えにコメントを参照してください) – OneWorld

+1

@oneworld、はい私は静的プロパティは本当にこのタイプのものの良い解決策ではないことに同意します。しかし、あなたはそのようにすることができます。答えのポイントは、あなたに危険を認識させ、代替案を提示することです。 – hvgotcodes

1

静的変数は、C言語のグローバル変数のオブジェクト指向の代替変数です。可能な限り、静的変数は避けてください。

多くの場合、オブジェクトが1つだけ必要です。その場合は、Prefsオブジェクトです。

public class Prefs { 

    //known before runtime 
    public final String SERVER_BASE_URL ="http://api.mycompany.com/"; 

    //needs to be set on startup through the setter method 
    private String token; 


    public String getToken() { 
    return token; 
    } 

    public void setToken(String token) { 
    Prefs.token = token; 
    } 

    public String getXyEndpointUrl() { 
    return SERVER_BASE_URL + "/xy"; 
    } 

} 

public class Program { 

    protected Prefs prefs; 

    protected Other prefsAware; 

    public Program() { 
    prefs = new Prefs(); 
    prefsAware = new Other(prefs); 
    } 

    // or even (if you don't like constructor mediated passing of prefs) 
    public Prefs getPrefs() { 
    return prefs; 
    } 

} 
+0

「可能な限り避けてください」 http://developer.android.com/guide/practices/design/performance.html#prefer_static – OneWorld

+1

オブジェクト指向の優れた設計と私のプラットフォームで高速に実行されるものには違いがあります。 Androidは静的に高速アクセスできますが、静的にすると保守性が損なわれます。おそらくあなたは時期尚早に最適化しているでしょうか?あなたはこのアイテムを2〜3回しか読まず、オブジェクト指向の優れたデザインでは、プログラムの他の部分ではスピードを計ることができます。あるいは、 "Javaに埋め込まれたC"にすべてを書くこともできます。 –

関連する問題