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连续运行的应用程序
- 我们的困惑是,如果我们将方法保留为实例方法,那么我们必须将
类的对象装箱,最终将始终保持windows应用程序使用的状态dbhelper
- 我认为将方法保持为静态的优点是不需要对象
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,可以让您模拟静态方法。)
这些都是引导我将方法变成实例方法的原因。如果您确定它们不适用,那么可以将它们设置为静态方法 这个问题太宽泛,无法给出具体的答案。但总的来说,我可以用我想的事情来回答