dbHelper 的静态或实例方法?

static or instance methods for dbHelper?

我有以下情况,并且对 dbhelper 的实例方法或静态方法感到困惑?

注:

我知道静态方法和实例方法是如何工作的。

Google 搜索对这个具体示例没有帮助。

不使用静态,而是使用 dbHelper 的单例设计方法 class。

像这样,

public class MyDBHelper {

private static MyDBHelper instance;

private MyDBHelper(){}

public static MyDBHelper getInstance(){
    if(instance == null){
        instance = new MyDBHelper();
    }
    return instance;
}

public void addRow() {
 ........
    }

}

从其他 classes,您可以访问如下方法

MyDBHelper.getInstance().addRow();

1st : 制作 class dbhelpe static 的所有方法并在您的应用程序被任何 web/application server.This 任务加载时加载它们通过 static block .

2:尝试在你的dbhelpclass上实现Singleton pattern,这样你的class只能共享一个对象,这不会导致你的申请多次创建对象,您的应用程序将运行得更快。

首先,多个调用者(Web 应用程序和 Windows 应用程序)使用的一个 class 中的方法表明违反了 SRP,因此您应该划分单个 DB 助手分成多个 classes.

其次,静态方法和实例方法各有优缺点。

如果你练习 TDD or DI, it discourages static methods as they are non-mockable (unless you use a framework like Powermock 这对我来说似乎有点老套。)

如果只做端到端测试,用静态方法没问题。

问题太宽泛,无法给出具体答案。但我可以回答一般情况下我会考虑的事情。

首先,如果您的静态方法要将状态保存在静态 class 变量中,那不是好的做法。如果涉及任何状态,您肯定希望使它们成为实例方法,以便该实例的对象将保持状态。

您提到您的方法可以帮助处理数据库。他们将如何访问数据库?如果数据库没有作为方法参数之一传递,那么这意味着对数据库的引用必须存储在某个地方,我认为最好是 dbhelper 是一个存储对数据库的引用(或引用到可用于检索数据库对象的其他对象)作为实例字段之一。

所以我将假设这些方法采用数据库参数,或者将参数传递给将为您提供数据库对象的其他对象。鉴于此,在考虑是否将您的方法设为静态时,我会考虑两件事。

(1) 方法因需求变化而变化的可能性有多大?如果有可能,那么我肯定会倾向于制作方法实例方法;事实上,我会考虑使 "dbhelper" 成为一个抽象 class 或接口,并让不同的实现 classes 在发生变化时以不同的方式实现抽象方法。在我看来,这比仅拥有一个静态 class 更灵活,如果业务逻辑发生变化,其代码必须更改。它可以让你来回切换,甚至可以让你在 运行 时间动态切换逻辑。

(2) 是否要模拟测试方法?如果您的方法访问数据库,那么您可能希望在对调用该方法的其他 class 进行单元测试时提供该方法的模拟版本,因为您希望能够测试它们而不必担心设置数据库访问和一切。这也将支持使 dbhelper 成为抽象或接口,以便您可以在实际实现之外提供模拟实现。 (但是,一些测试平台,如 JMockit 将允许您模拟静态方法。)

这些是导致我将方法变成实例方法的原因。如果您确定它们不适用,那么将它们设为静态方法应该没问题。