java web应用程序中的静态层

java web应用程序中的静态层,java,data-access-layer,business-logic-layer,Java,Data Access Layer,Business Logic Layer,我正在使用一个相当标准的Web/服务/数据访问分层设计构建一个小型网站,用于娱乐/学习 为了避免不断创建服务层/数据访问层类的实例,我将其中的方法都设置为静态。我不应该遇到并发问题,因为它们使用局部变量等,并且不共享任何资源(目前的情况非常简单) 据我所知,唯一的折衷办法是,我并没有真正遵循真正的面向对象方法,但它使代码更加干净 是否有任何理由认为这不是一个可行的方法?以后会出现什么样的问题?如果有一个“factory”类,可以根据需要返回服务和数据层类的实例,那会更好吗?我认为,对于多个用户的

我正在使用一个相当标准的Web/服务/数据访问分层设计构建一个小型网站,用于娱乐/学习

为了避免不断创建服务层/数据访问层类的实例,我将其中的方法都设置为静态。我不应该遇到并发问题,因为它们使用局部变量等,并且不共享任何资源(目前的情况非常简单)

据我所知,唯一的折衷办法是,我并没有真正遵循真正的面向对象方法,但它使代码更加干净


是否有任何理由认为这不是一个可行的方法?以后会出现什么样的问题?如果有一个“factory”类,可以根据需要返回服务和数据层类的实例,那会更好吗?

我认为,对于多个用户的所有静态方法,都会出现并发问题。web层将清除并发用户。所有的静态方法都能处理这个问题吗?也许吧,但它们不会一直被锁定在单个文件中的请求队列中吗?我不确定,从来没有尝试过你的想法。

你知道游乐园里的那些游乐设施,上面写着“请随时把手和脚放在游乐设施内”?事实证明,如果你不这样做的话,骑车会更有趣。唯一一个真正的权衡是,你没有真正遵循一个真正的方法,始终保持你的手和脚在骑乘中


关键是——你有理由遵循“真正的面向对象方法”,就像你有理由让你的手和脚在车内一样——这非常有趣,直到你开始到处流血

从您描述的方式来看,这本身并不是一个“错误”的方法,但我并不真正看到您试图避免的问题。难道不能在服务器启动时创建这些业务对象的单个实例,并根据需要将它们传递给servlet吗


如果您准备将OO扔出窗口,那么您可能还想查看单例模式。

我并不认为您的设计有什么好处,而且有很多地方可能会出错。你可能正在保存一行代码?以下是您的方法的一些缺点:

  • 您无法轻松替换业务逻辑的实现
  • 您不能定义实例变量以便于将逻辑分解为多个方法
  • 您认为不会出现多线程问题的假设几乎肯定是错误的
  • 您无法轻松地模拟它们进行测试
我真的不认为省略一行代码就能给你带来任何好处

这不是一个真正的“OO设计”问题,而是一个更合适的问题。你为什么要以这样一种程序化的方式使用Java?当然,PHP更适合这种设计(实际上不必编译和部署,从而节省了您的时间)


我只想让你的业务层非静态;它将使您的应用程序更易于维护、更改和发展。

您可能很难使用这种类型的体系结构对对象进行单元测试。例如,如果您有一个引用静态数据访问层的业务对象层,那么测试业务层可能会很困难,因为您将无法轻松使用模拟数据访问对象。也就是说,在测试业务层时,您可能不想使用数据访问层中的“真实”方法,因为它们会对数据库进行不必要的更改。如果您的数据访问层不是静态的,那么您可以为业务层提供模拟数据访问对象以进行测试。

缺点:

  • 您将无法编写单元测试,因为您将无法编写模拟数据访问/业务逻辑对象进行测试
  • 当不同的线程试图同时访问静态代码时,您将遇到并发问题,或者如果您使用同步静态方法,那么最终将导致线程排队使用静态方法
  • 您将无法使用实例变量,随着代码变得更加复杂,这将成为一个限制
  • 若需要,替换业务层或数据访问层的元素将更加困难
  • 如果您打算以这种方式编写应用程序,那么最好使用设计为以这种方式工作的语言,例如PHP
您最好选择非静态业务/数据访问层类,方法是:

  • 使用单例模式(创建每个类的单个实例并在线程之间共享它们)
  • 或者在需要时在每个线程中创建类的实例
请记住,连接到应用程序的每个用户/会话都将在其自己的线程中运行,因此您的web应用程序本质上是多线程的