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

最好将Config类作为单例

于 2012-08-02T15:32:49.323 回答
2

给定的Config似乎表明这个类应该是一个单例,如果是这样,那么static为所有成员使用变量就可以了。你会有多个Configs,还是只有一个?

如果Config不打算成为单例,则static在这种情况下不需要,或者如果是这样,只有在可以与您的班级的每个实例共享您Datastore情况Config。您将通过一个简单的静态成员变量来实现您的目标,并且您仍然可以拥有例如getDataStore方法。但是每个Config班级都有自己的 Datastore

static当您还想在类的多个实例之间共享它时才使用。DatastoreConfig

于 2012-08-02T15:31:46.273 回答
1

这是使用静态变量的正确方法吗?

好吧,您的代码似乎可以按照正确的语言进行编译。就语义而言,用法取决于。这取决于问题中的课程,您想要实现的设计。

我会亲自去一个连接池。如果不需要多个连接,singleton如果我只需要维护一个连接,我可能会选择一个。如果不需要单个连接,我会使用成员变量。

在您的情况下,这取决于您希望如何使用config该类。在一般设计方面,您所做的事情是problematic出于以下原因:

  • 您的类中的所有内容都是静态的,就面向对象而言没有任何用途。
  • powermock除非您使用或其他一些框架,否则您不能对此类进行单元测试。
  • 当有人connect()多次打电话时会发生什么?

*注: Singleton是一个anti-pattern. 通常,任何全局状态都是不好的。我会尽可能地避免它。

于 2012-08-02T15:47:13.823 回答