验证类应该是静态类吗?

10

我正在处理一个每秒钟收到数千个请求的系统,我们需要尽量避免创建不必要或额外的对象。

我们需要对每个请求中的 6 个请求项进行验证。

我考虑为每个请求项创建一个验证类。

然而,我在思考是否应该使用包含 HttpRequest 实例字段的对象与实例化的静态验证类。

我应该使用静态类还是对象?你会选择哪种方法?

基本上,我正在向请求处理程序注入 List<IValidator> 验证器,并对其进行迭代,但不确定是否应该使用实例化的类还是静态类。


2
在你的例子中,这个状态是必要的吗? - JonH
2
您似乎已经在回答自己的问题,因为您需要具有有状态验证器,这表明创建新的验证器对象是正确的方法?现代JVM确实非常擅长处理短暂的对象。 - Affe
2
@DarthVader 嗯,这样做可以避免使用静态变量,从而使得测试、模拟等更加容易。同时,每种类型只需要实例化一个对象,因此不会占用太多内存。 - jeff
1
@jeff 当每秒收到数千个请求时,这就会累加起来。 - DarthVader
@DarthVader,什么是加法?你无法改变请求的数量,但你可以改变需要服务的对象数量。如果你创建无状态验证器,那么你可以使用相同的验证器对象来服务所有请求。 - jeff
显示剩余7条评论
2个回答

9

您是否实际测量过创建新的验证器实例对内存的影响,而不是重复使用静态方法?使用短暂对象的成本非常非常小。您应该测量这两种方法之间的差异,如果没有可测量的差异,则使用代码更加清晰易懂的那一种。

在这种情况下,总是有意义去测量差异,而不是仅仅假设哪种方法更好。


好的,有一个L&B团队来衡量它,上次他们回来说我们有太多的对象。 - DarthVader
2
有很多原因导致“对象过多”。其中最常见的是字符串解析。 - Hot Licks
2
唯一真正了解哪种方法在您的应用程序中具有更高性能和较低GC影响的方法是在您的应用程序中进行基准测试和测量。对于这种类型的事情,仅仅采纳公认的智慧并将其应用于您的独特情况可能是危险的。特别是考虑到分配和垃圾回收短生命周期对象的成本经常被高估。 - matt b
2
如果您有时间观看,这是一位Twitter开发人员在JVM性能和GC调优方面的好演示,他们在这方面有很多实践:http://www.infoq.com/presentations/JVM-Performance-Tuning-twitter - matt b
如果短暂的对象是长期存在的类的一部分,您可以使用单例模式来确保同一时间只存在一个对象。 - d00d
显示剩余2条评论

1
在多线程环境中,使用静态类/方法总是会带来并发陷阱。由于创建和收集短暂的对象很便宜,因此通常最好创建短暂的对象,而不是遇到昂贵的并发问题和额外的同步。 Struts出于类似的原因从静态请求处理程序切换到基于实例的请求处理程序。

2
并发问题似乎只会在修改静态变量时发生:https://dev59.com/P2Yq5IYBdhLWcg3w4EZx - user800014

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接