Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java dbHelper的静态或实例方法?_Java_Database_Static_Instance - Fatal编程技术网

Java dbHelper的静态或实例方法?

Java dbHelper的静态或实例方法?,java,database,static,instance,Java,Database,Static,Instance,我有以下场景,对于dbhelper,使用实例方法还是静态方法比较混乱 我们有一个dbhelper类,它的名字建议帮助其他类使用MySql db db helper类将由2个独立的模块使用。 javawebapp。 基于Windows的Java应用程序 目前dbhelper类中的所有方法都是实例方法 dbhelper类中有8个方法,其中3个是webapp和windows app的常用方法,其余的仅由webapp使用 Windows应用程序是一种24*7连续运行的应用程序 我们的困惑是,如果我们将

我有以下场景,对于
dbhelper
,使用实例方法还是静态方法比较混乱

  • 我们有一个dbhelper类,它的名字建议帮助其他类使用MySql db
  • db helper类将由2个独立的模块使用。 javawebapp。 基于Windows的Java应用程序

  • 目前dbhelper类中的所有方法都是实例方法 dbhelper类中有8个方法,其中3个是webapp和windows app的常用方法,其余的仅由webapp使用

  • Windows应用程序是一种24*7连续运行的应用程序

  • 我们的困惑是,如果我们将方法保留为实例方法,那么我们必须将
    dbhelper
    类的对象装箱,最终将始终保持windows应用程序使用的状态

  • 我认为将方法保持为静态的优点是不需要对象

注意:

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


Google search对这个特定示例没有帮助。

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

像这样的,

public class MyDBHelper {

private static MyDBHelper instance;

private MyDBHelper(){}

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

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

}
从其他类中,您可以访问如下方法

MyDBHelper.getInstance().addRow();

对于dbHelper类,使用单例设计方法,而不是使用静态方法

像这样的,

public class MyDBHelper {

private static MyDBHelper instance;

private MyDBHelper(){}

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

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

}
从其他类中,您可以访问如下方法

MyDBHelper.getInstance().addRow();

第一:使类的所有方法
dbhelpe
静态
,并在应用程序被任何web/应用程序服务器加载时加载它们。此任务可以通过
静态块
完成


第二:尝试在
dbhelp
类上实现
Singleton模式
,这样类中只有一个对象可以共享,这不会导致应用程序多次创建对象,您的应用程序将运行得更快。

1st:使类的所有方法
dbhelpe
静态
,并在应用程序被任何web/应用程序服务器加载时加载它们。此任务可通过
静态块
完成


第二:尝试在
dbhelp
类上实现
Singleton模式
,这样只能共享类中的一个对象,这将不会导致应用程序多次创建对象,并且应用程序将运行得更快。

首先,一个类中的方法由多个调用方使用(web应用程序和Windows应用程序)建议违反,因此应将单个DB帮助程序划分为多个类

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

如果您使用或,它会阻止静态方法,因为它们是不可模仿的(除非您使用的框架在我看来似乎有点黑客)


如果您只进行端到端测试,则可以使用静态方法。

首先,多个调用方(web app和Windows app)使用的一个类中的方法表示违反,因此您应该将单个DB helper划分为多个类

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

如果您使用或,它会阻止静态方法,因为它们是不可模仿的(除非您使用的框架在我看来似乎有点黑客)


如果只进行端到端测试,可以使用静态方法。

这个问题太宽泛,无法给出具体的答案。但总的来说,我可以用我想的事情来回答

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

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

因此,我将假设这些方法接受一个数据库参数,或者一个其他对象的参数,该对象将为您提供数据库对象。考虑到这一点,在考虑是否将方法设置为静态时,我会考虑两件事

(1) 由于需求改变,方法改变的可能性有多大?如果有可能的话,那么我肯定倾向于让方法成为实例方法;事实上,我会考虑将“DigelHelp”抽象为一个类或接口,并且在不同的情况下,不同的实现类以不同的方式实现抽象方法。在我看来,这似乎比只有一个静态类更灵活,如果业务逻辑发生变化,该类的代码就必须改变。它允许您来回切换,甚至允许您在运行时动态切换逻辑

(2) 您想模拟测试方法吗?如果您的方法访问一个数据库,那么在单元测试调用该方法的其他类时,您可能希望提供该方法的模拟版本,因为您希望能够测试它们,而不必担心设置数据库访问和一切。这也有助于将dbhelper抽象化或接口化,以便在实际实现之外提供模拟实现。(但是,一些测试平台,如JMockit,可以让您模拟静态方法。)


这些都是引导我将方法变成实例方法的原因。如果您确定它们不适用,那么可以将它们设置为静态方法

这个问题太宽泛,无法给出具体的答案。但总的来说,我可以用我想的事情来回答