【问题标题】:Should validation classes be static classes?验证类应该是静态类吗?
【发布时间】:2012-08-28 18:06:04
【问题描述】:

我正在开发一个每秒收到数千个请求的系统,基本上我们试图避免的任务之一是创建不必要的/额外的对象

我们需要验证 6 个请求项本身的传入请求。

我正在考虑为每个项目验证创建一个类。

但是,我试图证明我是否应该使用静态验证类与包含 HttpRequest 作为实例字段的实例的对象。

我应该使用静态类还是对象?你会怎么做?

本质上,我正在做的是将List<IValidator> validators 注入到请求处理程序并对其进行迭代。但不确定我是否应该有一个实例与静态类。

【问题讨论】:

  • 实例服务的优点/目的是什么,恕我直言,这个问题非常适合静态设计。
  • 对,但在您的示例中,这种状态是否必要?
  • 您似乎已经回答了您自己的问题,因为您对有状态验证器的要求表明制作新的验证器对象是正确的方法?现代 JVM 非常擅长处理短暂的对象。
  • @DarthVader 好吧,这让你不使用静态,所以测试、模拟等会更容易。它还只需要实例化每种类型中的一种,因此不会消耗大量内存。
  • @jeff 当你每秒收到数千个请求时,它会加起来。

标签: java static


【解决方案1】:

您是否实际测量过创建新的 Validator 实例与重用静态方法对内存的影响?使用短命对象的成本非常非常小。您应该衡量这两种方法之间的差异,如果没有可衡量的差异,请使用代码更清晰、更易于理解的那一种。

在这种情况下,衡量差异总是有意义的,而不是仅仅假设一个比另一个更好。

【讨论】:

  • 好吧,有 L&B 团队对其进行测量,上次他们回来的结果是说我们有太多对象。
  • “太多”与什么相比?是否使用静态方法而不是短期对象来测量相同的应用程序?冒着做出仓促判断的风险,“对象太多”本身听起来像是仓促判断。
  • 拥有“太多对象”的原因有很多。迄今为止最常见的是字符串解析。
  • 要知道哪种方法在您的应用程序中性能更高且对 GC 影响更小,唯一真正的方法是对应用程序中的两种变化进行基准测试和测量。对于这种类型的事情,仅仅采用公认的智慧并将其应用于您的独特情况可能是危险的。特别是考虑到分配和垃圾收集短期对象的成本经常被高估。
  • 如果你有时间看,这是 Twitter 开发人员关于 JVM 性能和 GC 调优的一个很好的演示,他们在那里进行了大量实践:infoq.com/presentations/JVM-Performance-Tuning-twitter
【解决方案2】:

在多线程环境中,使用静态类/方法总是会带来并发陷阱。由于短期对象的创建和收集成本很低,因此创建短期对象通常比遇到并发问题和额外的同步要好,后者很昂贵。

Struts 出于类似原因从静态请求处理程序切换到基于实例的请求处理程序。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2013-05-20
相关资源
最近更新 更多