2012-04-18 11 views
2

Javaで小さなHTTPサーバーを作成しましたが、要求を処理するスレッドに静的変数(サーバー構成:ポート、ルートなど)を渡すときに問題があります。スレッドにこれらの変数を変更させたくないのですが、サーバークラスを拡張しても、私が望ましくないメソッドを継承します。スレッドに静的フィールドを渡す

私はパフォーマンスの理由からゲッターを使いたくありません。静的メンバーを最終的にすると、設定ファイルから値をロードするときに問題が発生します。ここ

は、私はまた、入れ子になったクラスとして労働者を持っている必要はありません例

class HTTPServer { 
static int port; 
static File root; 
etc.. 
.... 
//must be public 
public void launch() throws HTTPServerException { 
    loadConfig(); 
    while (!pool.isShutdown()) { 
      .... 
     //using some config here 
      ... 
     try { 
    Socket s = ss.accept(); 
    Worker w = new Worker(s); 
    pool.execute(w); 
     }catch() {...} 
    } 
} 
private void loadConfig(){ //reading from file}; 
... 
other methods that must be public goes here 
} 

です。別のパッケージに入っています...

あなたは何を提案しますか?

+7

最初にコードを正しく(ゲッターとすべてを使用して)コードすると、後でパフォーマンスが心配することがあります。 – biziclop

+2

これらはコンストラクタパラメータとして渡される 'HTTPServer'の通常の静的ではない最終フィールドでなければなりません。また、早すぎるものを最適化しないでください。ゲッターの費用はほとんどありません。 –

+0

私の意見では、あなたはそれから完全な混乱を作る方法についての私たちに尋ねます。 –

答えて

2

あなたの設定を最終的にAtomicReferenceに入れることができます。その後、ワーカーが参照し、スレッドセーフな方法で更新することもできます。以下のような

何か:次に、あなたの労働者はHTTPServer.config.get()を介して電流設定への参照を取得することができます

class ServerConf { 
    final int port; 
    final File root; 
    public ServerConf(int port, File root) { 
    this.port = port; 
    this.root = root; 
    } 
} 

class HTTPServer { 
    public static final AtomicReference<ServerConf> config = 
    new AtomicReference(new ServerConf()); 
} 

は不変新しいServerConfクラスを作成します。おそらくのようなもの:すべての設定を同時に変更することは重要ではありません場合は、あなたがServerConfクラスと使用をスキップすることができ

HTTPServer.config.set(new ServerConf(8080, new File("/foo/bar")); 

Worker w = new Worker(s, HTTPServer.config.get()); 

loadConfig()のようなものを経由して新しい設定を設定することができますポート設定はAtomicInteger、ルートはAtomicReference<File>です。

0

スタティックデータを静的な 'sharedConfig'オブジェクトに読み込みます。このオブジェクトにはソケットフィールドもあります。このフィールドは、リスニングソケットに使用できます。 acccpet()がサーバ<>クライアントソケットを返し、 'sharedConfig'をクローンし、新しいソケットを押し込み、そのオブジェクトをサーバ<>クライアントワーカースレッドに渡します。スレッドは、他のスレッドや静的な設定を修正することなく削除したい場合や、変更することができる設定のコピーを取得します。

関連する問題