静态vs对象实例化

时间:2014-12-08 13:21:54

标签: java

我正在使用struts2框架开发一个网站。

我只需要有关何时使用静态方法以及何时为类实例化对象的建议。

例如: 在我的数据库连接中,我使用单例,这样每个用户只能有一个数据库连接(这是正确的吗?) 我想如果我有一个类,让我们说它是一个充满方法的类,只是为了操纵数据库中的数据。我应该将这些方法设为静态吗?或者我应该让这个类成为一个单身人士,所以我的应用程序只有一个类的实例充满方法?

2 个答案:

答案 0 :(得分:1)

静态方法非常适合“纯函数”:这些代码不依赖于配置的运行时状态而且没有副作用。

匹配上述描述的方法可以很容易地进行单元测试,因为它没有任何你必须模拟的依赖项,而且模拟它的功能也没有意义。

有时,即使是符合上述描述的函数也可能受益于实用程序对象的实例方法,因为这样可以利用多态来覆盖某些行为。就个人而言,我从来没有这样的需要,因为我选择实现静态的那些方法只有一个有意义的实现。

此外, factory 方法基本上必须是静态的,因为它们是提供实例的方法。工厂方法可以很简单(构造函数周围的一些方便)或具有依赖性,尤其是在某些配置上。在客户端代码中,您可以通过依赖依赖注入框架来避免重量级工厂方法,但通常独立库将通过提供静态工厂方法为其API提供入口点。

答案 1 :(得分:0)

一旦你开始在网络应用程序的上下文中讨论static和单身人士,你现在谈论的是对static / singleton事物的并发访问,这在两个方面是潜在的麻烦:< / p>

  • 没有足够的线程安全性,您将遇到非法共享等问题 访问(可能与您的数据库连接),数据损坏,竞争 条件等。
  • 过多的线程安全性会导致并发性,并且对共享的static资源的访问成为应用中所有内容的synchronized瓶颈

通常,您应该在任何多线程环境(例如Web应用程序)中避免使用static。您的static事物是数据库连接这一事实会引入其他问题,但也会引入解决方案。使用第三方数据库连接池,例如c3p0DBCP或类似名称。然后,您根本不必担心管理单例或并发。游泳池足够聪明,可以照顾两者。