在JAVA企业应用程序中使用静态方法

在JAVA企业应用程序中使用静态方法,java,jakarta-ee,Java,Jakarta Ee,我正在开发一个企业java应用程序,它本质上是一个HTTP服务器。在那里,我需要使用一些常量和排序实用函数来解析、文件I/O等。我为此使用了静态方法和变量,但有人向我指出,从性能和内存的角度来看,使用静态是一个糟糕的选择 虽然我不同意这一论点,但我也看不到任何其他选择。即使我将它们转换为实例方法,并通过单例实例进行访问,该实例也会被一些静态函数访问 所以,我想知道这是否真的是个问题。如果是,最好的解决方法是什么 提前谢谢 简而言之,除非这个Util类很大,否则这不会带来启示。您不应该忽略静态类的

我正在开发一个企业java应用程序,它本质上是一个HTTP服务器。在那里,我需要使用一些常量和排序实用函数来解析、文件I/O等。我为此使用了静态方法和变量,但有人向我指出,从性能和内存的角度来看,使用静态是一个糟糕的选择

虽然我不同意这一论点,但我也看不到任何其他选择。即使我将它们转换为实例方法,并通过单例实例进行访问,该实例也会被一些静态函数访问

所以,我想知道这是否真的是个问题。如果是,最好的解决方法是什么


提前谢谢

简而言之,除非这个
Util
类很大,否则这不会带来启示。您不应该忽略静态类的使用,因为它们很有用,而且看起来也更好

MyFileReader.readFile("C:/file.txt");
看起来比:

MyFileReader mfr = new MyFileReader();
mfr.readFile("C:/file.txt");

而且,如果将其更改为实例方法,则必须在每次使用该对象时创建该对象。我相信这也会影响性能。您的应用程序将使用更多内存,但如果类的大小合理(如果不是,则应将其拆分),那么您应该可以

你说得很对,最终一切都是从一个静态
main()
方法运行的。而且许多函数都适合静态,例如
java.lang.Math
上的简单方法。速度和内存使用不是问题-静态方法不会比任何其他方法占用更多内存或运行速度较慢。在内部,它与任何其他方法完全相同,但它是在类实例而不是类实例上定义和运行的

我发现静态方法的一个问题是,很容易在不经意间引入一些特定的假设(例如,目录所在的位置),这使得在其他地方重用该函数变得更加困难。测试代码也会变得更加困难。当您进行单元测试时,您通常希望能够在不进行*耗时的)I/O的情况下进行测试-例如,通过模拟或剔除I/O部分。如果你的方法不允许,那就更难了。单例类可能会导致类似的测试困难

静态方法倾向于生成功能性或过程性的代码,而不是面向对象的代码。我发现静态方法作为对象的丰富领域模型之上的“语法糖”的功能层很有用


还值得一提的是,有大量的现有实用程序类,例如,等等。它们编写得很好,使用量很大,测试也很好。在重新发明轮子之前,你可以考虑看它们。

实际上,在使用实用方法的<静态>方法

中,我可以看到更多的好处。
  • 它将允许您创建构造函数
    private
    ,它与标记为
    final的类一起清楚地表明该类是一个库
  • 它允许您静态导入方法,如
    import static SomeClass.someMethod这样您就不必一遍又一遍地写类名了
  • 如果你不打算有1000个方法,我真的怀疑性能是一个大问题(无论如何,这是一个非常糟糕的设计)
但有人向我指出,出于这个目的使用static是一个糟糕的选择,因为从性能和内存的角度来看

这是不真实的或迷信的,或两者兼而有之! 要求他们证明静态方法速度较慢,或者在其他同等情况下使用更多内存

这两种方法(不惜一切代价避免静态/使一切都静态)都不好

您是否测试代码

通过测试,
静态
的缺点变得明显:

  • 您不能模拟静态方法:如果您
    Util
    class打开了一个文件,那么在测试时您必须拥有该文件
  • 不能替换静态方法
  • 您不能通过对
    Util
    类进行子类化(然后更改CDI容器注入的类)来生成这些方法的更专门的版本
除非您正在构建一个不太可能更改的真正的实用程序库(如Apache Commons),请使用实例方法并使用单例

无论谁在将来选择您的代码并需要更改它,都会感谢您


后续行动:



:实际上,您可以使用PowerMock等工具模拟
静态
方法。但它们的侵入性太强,而且它们产生的测试非常脆弱,以至于无法达到测试的目的。对这样一个工具的需求是代码库中问题的有力指示器。(随着时间的推移,这些工具对于遗留系统测试非常有用。)

首先,问问自己为什么要使用静态方法或单例测试?当您计划使用静态方法或单例时,您需要有这样做的理由。在某些情况下,这可能是最好的方法

有两种类型的“静态方法”:

  • “安全静态方法”-alawys为相同的参数生成相同的结果,不修改任何全局值并调用“不安全静态方法”。使用这些方法是可以的-我不担心
  • “不安全静态方法”-更改全局状态或全局或对象的方法。这些方法很难检验。使用这些是非常危险的

有些人倾向于过度使用静态方法,尤其是那些习惯于过程语言的人。消除这种想法的最好方法是彻底理解面向对象的原则和实践。我认为TDD很有帮助——静态方法很难测试,使用TDD会迫使您创建“可测试”的代码,这通常也是一个设计合理的代码。

使用静态方法确实是一个性能问题,因为它在编译时就解决了。 从记忆的角度来看,我不知道