正确使用静电

时间:2012-08-02 15:29:39

标签: java mongodb static

目前我正在使用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变量的正确方法吗?

3 个答案:

答案 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()时会发生什么?

*注意: Singletonanti-pattern。通常任何全球状态都是糟糕的。我会尽可能地避免它。