目前我正在使用mongodb和java。我不想每次都重新打开我与数据存储区的连接,所以我想我应该创建一个静态变量:
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
变量的正确方法吗?
答案 0 :(得分:4)
最好将Config
作为singleton。
答案 1 :(得分:2)
给定的Config
似乎表明这个类应该是一个单例,如果是,那么对所有成员使用static
变量就可以了。你会有多个Configs
,还是只有一个?
如果Config
不是单身人士,则在这种情况下不需要static
,或者如果是,只有在可以与<{1}}分享时才可以em>您Datastore
课程的每个实例。你可以用一个简单的 - 非 - 静态 - 成员变量来实现你的目标,你仍然可以使用,例如一个Config
方法。但每个getDataStore
类都会拥有拥有 Config
如果您想在Datastore
课程的多个实例中分享 static
,则仅使用Datastore
。
答案 2 :(得分:1)
好吧,你的代码好像是按照语言正确编译的。就语义而言,使用取决于。它取决于问题中的类,你想要实现的设计。这是使用静态变量的正确方法吗?
我个人会去connection pool。如果不需要多个连接,如果我只需要保持一个连接,我可以去singleton
。如果不需要单个连接,我会使用成员变量。
在您的情况下,这取决于您希望如何使用config
类。在一般设计术语中,您所做的是problematic
,原因如下:
powermock
或其他框架,否则无法对此课进行单元测试。connect()
时会发生什么? *注意: Singleton
是anti-pattern
。通常任何全球状态都是糟糕的。我会尽可能地避免它。