应该实例化实用程序类吗?

时间:2015-03-24 09:58:29

标签: java performance concurrency

我目前正在为一所大学开设一个新项目,并对处理我为执行实用操作(如散列密码)而创建的类的最佳方法感到好奇。

实用程序类是否应该包含静态方法,以便我将它们称为

Utilities.hashPassword(password,salt); 

或者我应该为每次通话创建一个新实例

new Utilities().hashPassword(password, salt);

现在我对该类中的函数的每次调用都有一个新实例,但我关注这个的性能影响,并且想知道它是否甚至是不必要的。

我实例化它们的原因是因为我不确定线程​​安全是如何工作的,并且担心多个用户调用相同的静态函数会导致问题。在阅读了关于java并发的一些材料之后,我现在非常确定即使该方法是静态的,它也是线程安全的。

我应该将它们全部更改为静态方法吗?这会改善表现吗?现在我的测试服务器在负载下弯曲。

由于

2 个答案:

答案 0 :(得分:1)

线程安全并不关心方法是静态还是真正的成员方法。 线程安全关心并发修改数据。因此,如果您的方法正在更新某些通用数据结构,那么只要将其设置为静态就不是线程安全的。

反对“静态”的参数:任何静态的东西都很难在单元测试中模拟。因此为了方便起见,要非常谨慎地制作静态物品。

关于性能方面:java中的对象创建非常便宜(不完全免费,但便宜)。在你的情况下 - 你可以保持它成员方法 - 只是避免一直扔掉你的实用程序对象。

答案 1 :(得分:0)

  

我应该将它们全部更改为静态方法吗?

是。实用方法应该是静态的。因为,new Utilities().hashPassword(password, salt);不使用hashPassword(password, salt)的静态导入,而不是{{1}}。更短,更容易阅读。

  

这会改善表现吗?

是。声明静态将节省内存。它还将提高可读性。

另请参阅: Java: when to use static methods