【问题标题】:Should a utlity class be instantiated?是否应该实例化实用程序类?
【发布时间】:2015-03-24 09:58:28
【问题描述】:

我目前正在为大学做一个新项目,并且很好奇处理我创建的用于执行实用程序操作(例如散列密码)的类的最佳方法。

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

Utilities.hashPassword(password,salt); 

或者我应该为每个调用创建一个新实例

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

现在,对于该类中的函数的每次调用,我都有一个新实例,但我担心这对性能的影响,我想知道它是否甚至有必要这样做。

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

我应该将它们全部更改为静态方法吗?这会提高性能吗?现在我的测试服务器在负载下崩溃了。

谢谢

【问题讨论】:

  • 你在你的服务器上做什么样的负载平衡?
  • 所有方法都是静态的,并将构造函数设为私有,以确保它不能被实例化
  • 尽可能避免使用实用程序类:它们很痛苦。 new Utilities().hashPassword(password, salt); 很容易成为:new PasswordHasher().hashPassword(password, salt);。然后你就有了一个职责明确的好班级:不是垃圾场。
  • 如果没有看到确切的案例和适当的测量,我显然无法确定,但如果实用程序类的实例化导致如此多的额外负载,我会感到非常惊讶。 (有可能,我已经看到了,但通常还有其他原因。)

标签: java performance concurrency


【解决方案1】:

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

反对“静态”的论点:任何静态的东西都很难在单元测试中模拟。因此,为了方便起见,请务必小心将内容设为静态。

关于性能方面:Java 中的对象创建非常便宜(不是完全免费,但很便宜)。在您的情况下-您可以将其保留为成员方法-只是避免一直丢弃您的实用程序对象。

【讨论】:

    【解决方案2】:

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

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

    这会提高性能吗?

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

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

    【讨论】:

    • ...并降低可测试性
    • 但是请记住,使用静态方法模拟测试您的代码可能会很烦人...
    • @Ria 但请记住,并非每个方法都需要模拟。事实上,编写不模拟事物的测试要容易得多,而且测试对它也同样有用。 (例外情况是您在测试中实际上无法控制的事物,例如外部 Web 服务)。
    • 投反对票的人,请注意发表评论,没有评论对任何人都没有帮助。
    • 我认为您仍在将意见假设为事实;例如,有很多人绝对不使用静态导入。这是风格和个人品味的问题。你发现一篇帖子说“静态方法没问题”;好吧,我有一个说“静态不好”(stackoverflow.com/questions/17380348/…)...现在呢?
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多