Java 静态与对象实例化

Java 静态与对象实例化,java,Java,我正在使用struts2框架开发一个网站 我只需要关于何时使用静态方法以及何时为类实例化对象的建议 例如: 在我的数据库连接中,我使用单例,这样每个用户只有一个数据库连接(这是正确的吗?) 我在想,如果我有一个类,假设它是一个充满方法的类,只用于处理数据库中的数据。我应该使这些方法也成为静态的吗?或者我也应该将类设置为单例,这样我的应用程序就只有一个类实例充满了方法吗?静态方法非常适合“纯函数”:这些代码不依赖于配置的运行时状态,也没有副作用 与上述描述相匹配的方法可以很容易地单独进行单元测试,

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

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

例如:
在我的数据库连接中,我使用单例,这样每个用户只有一个数据库连接(这是正确的吗?)
我在想,如果我有一个类,假设它是一个充满方法的类,只用于处理数据库中的数据。我应该使这些方法也成为静态的吗?或者我也应该将类设置为单例,这样我的应用程序就只有一个类实例充满了方法吗?

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

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

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


此外,工厂方法本质上要求是静态的,因为它们是提供实例的方法。工厂方法可以是简单的(对于构造函数来说有些方便)或者具有依赖性,特别是在某些配置上。在客户端代码中,您可以通过依赖项注入框架避免重量级工厂方法,但通常情况下,独立库将通过提供静态工厂方法提供API的入口点。

一旦您开始在web应用程序上下文中谈论
静态
和单例,您现在讨论的是并发访问
静态
/singleton,这在两个方面是潜在的问题:

  • 没有足够的线程安全性,您将遇到非法共享等问题 访问(可能与数据库连接)、数据损坏、竞争 条件等
  • 线程安全性太高,您将扼杀并发性,访问共享的
    静态
    资源将成为应用程序中所有内容的
    同步
    瓶颈

一般来说,在任何多线程环境(如web应用程序)中,都应该避免使用
静态
静态
是数据库连接这一事实会带来其他问题,但也会带来解决方案。使用第三方数据库连接池,如,或类似。然后,您根本不必担心管理单例性或并发性。池将足够聪明来处理这两个问题。

静态几乎每次都是UnitTests中的一个大问题。您的问题非常笼统和模糊,如果您不提供更多详细信息,您将无法得到答案。选择一个,看看它对您有何作用。下次选另一个。这是您学习的方式。“只有一个数据库连接”今天可能是正确的,但明天不会。使用DI框架创建一个实例,然后将其注入到需要的地方,而不是使用Singleton反模式将其“烘焙”到代码中。我会给出非常个人的意见,我需要支持讨厌的代码,其中大多数方法是静态的。相信我,那是人间地狱,甚至是最糟糕的事情。因此,如果可以的话,请避免使用静态方法,它们对实用程序很有用,仅此而已