0

現在、私はJavaでmongodbを使用しています。毎回データストアへの接続を再開したくないので、静的変数を作成する必要があると考えました。

package Config;

import java.net.UnknownHostException;

import com.google.code.morphia.*;

import com.mongodb.Mongo;
import com.mongodb.MongoException;

public class Config {

    static String dbUrl = "url";
    static int dbPort = portnumber;
    static String username = "user";
    static String password = "pw";
    static String dbName = "dbname";
    public static Datastore ds;

    public static Datastore getDatastore() throws UnknownHostException,
            MongoException {
        if (ds == null) {
            ds = connect();
        }
        return ds;
    }

    public static Datastore connect() throws UnknownHostException,
            MongoException {
        Mongo m = new Mongo(dbUrl, dbPort);
        Datastore ds = new Morphia().createDatastore(m, dbName);
        boolean con = ds.getDB().authenticate(username, password.toCharArray());// todo
        return ds;
    }
}

私は次のように使用します:

Config.getDatastore().doSomthing();

これらの未処理の例外に加えて、これはstatic変数を使用する正しい方法ですか?

4

3 に答える 3

4

Configclass をsingletonとして作成する方がよいでしょう。

于 2012-08-02T15:32:49.323 に答える
2

与えられConfigたものは、このクラスがシングルトンであるべきであることを示しているようです。そうであれば、staticすべてのメンバーに変数を使用しても問題ありません。を複数持ちますConfigsか、それとも 1 つだけ持ちますか?

Configシングルトンにすることを意図していない場合は、この場合は必要ありません。必要な場合は、クラスのすべてのインスタンスと共有しstaticても問題ない場合にのみ必要です。単純な非静的メンバー変数を使用して目標を達成しますが、メソッドなどを使用することもできます。しかし、各クラスには独自のものがありますDatastoreConfiggetDataStoreConfig Datastore

クラスの複数のインスタンス間で共有staticたい場合にのみ使用してください。DatastoreConfig

于 2012-08-02T15:31:46.273 に答える
1

これは静的変数を使用する正しい方法ですか?

まあ、あなたのコードは言語ごとに正しいようにコンパイルされているようです。セマンティクスに関する限り、使用法は依存します。質問のクラス、達成したいデザインによって異なります。

個人的には接続プールに行きます。複数の接続が必要ない場合は、singleton接続を 1 つだけ維持する必要がある場合に使用できます。単一の接続が必要ない場合は、メンバー変数を使用します。

configあなたの場合、クラスをどのように使用するかによって異なります。一般的な設計用語では、あなたが行ったことはproblematic次の理由によるものです。

  • クラスではすべてが静的であり、オブジェクト指向性に関しては何の役にも立ちません。
  • powermockまたは他のフレームワークを使用しない限り、このクラスを単体テストすることはできません。
  • connect()誰かが何度か電話をかけたらどうなりますか?

*注: Singletonanti-pattern. 一般に、グローバルな状態はすべて悪いです。私はできる限りそれを避けます。

于 2012-08-02T15:47:13.823 に答える