我有以下情况,并且为dbhelper
设置实例方法或静态方法会产生混淆?
db helper类将由2个独立模块使用。 Java Webapp。 基于Windows的Java应用程序
目前dbhelper类中的所有方法都是实例方法 dbhelper类中有8种方法,其中3种方法适用于webapp和windows应用程序,其余仅供webapp使用。
Windows应用程序是24 * 7持续运行。
我们的混淆是,如果我们将方法保持为实例方法,那么我们必须创建dbhelper
类的对象,并最终将像Windows应用程序一样使用。
我认为将方法保持为静态的优点是不需要对象。
注意:
我知道static和instance方法是如何工作的。
Google搜索对此具体示例没有帮助。
答案 0 :(得分:1)
不使用静态,而是使用Singleton设计方法为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();
答案 1 :(得分:1)
1st:创建类dbhelpe
static
的所有方法,并在任何Web /应用程序服务器加载应用程序时加载它们。此任务可以通过static block
完成。
第二:尝试在Singleton pattern
类上实现dbhelp
,这样只能分享您班级中的一个对象,这不会导致您的应用程序多次创建对象,您的应用程序将会工作得更快。
答案 2 :(得分:1)
首先,多个调用者(Web应用程序和Windows应用程序)使用的一个类中的方法建议违反SRP,因此您应该将单个数据库帮助程序划分为多个类。
其次,静态和实例方法有优点和缺点。
如果你练习TDD或DI,它会阻止静态方法,因为它们是不可模拟的(除非你使用像Powermock这样的框架,这对我来说似乎有点hacky。)< / p>
如果您只进行端到端测试,则可以使用静态方法。
答案 3 :(得分:1)
问题对于具体答案而言过于宽泛。但总的来说,我可以用我想到的各种事情来回答。
首先,如果你的静态方法要在静态类变量中保存状态,那不是很好的做法。如果涉及任何状态,您肯定希望将它们作为实例方法,以便该实例的对象将保持状态。
您提到您的方法可以帮助您使用数据库。他们如何访问数据库?如果数据库没有作为方法参数之一传递,那么这意味着必须将对数据库的引用存储在某个地方,如果dbhelper是存储引用的实例,我认为它是最好的。数据库(或对可用于检索数据库对象的其他对象的引用)作为实例字段之一。
因此,我假设这些方法采用数据库参数,或者将参数提供给将为您提供数据库对象的其他对象。鉴于此,在考虑是否使您的方法保持静态时,我会考虑两件事。
(1)由于要求发生变化,该方法的可能性有多大?如果它完全可能,那么我绝对倾向于制作方法实例方法;事实上,我考虑制作&#34; dbhelper&#34;一个抽象类或接口,并且具有不同的实现类,当事情发生变化时,以不同的方式实现抽象方法。在我看来,这比仅仅有一个静态类更灵活,如果业务逻辑发生变化,其代码必须改变。它允许您来回切换,甚至允许您在运行时动态切换逻辑。
(2)您想要模拟测试方法吗?如果您的方法访问数据库,那么您可能希望在对调用该方法的其他类进行单元测试时提供该方法的模拟版本,因为您希望能够测试它们而不必担心设置数据库访问权限和所有内容。这也有助于使dbhelper成为抽象或接口,因此除了真正的实现之外,您还可以提供模拟实现。 (但是,像JMockit这样的测试平台会让你模拟静态方法。)
那些会引导我制作方法实例方法的东西。如果你确定他们不适用,那么应该可以使它们成为静态方法。