私有帮助器方法与Java中的公共静态实用程序方法

时间:2017-06-28 09:26:25

标签: java spring static

我有一个变长的Java类。当我通过代码质量工具运行它时,我会被标记为类中的行数。

这是一个较低的图层类,由上层使用Spring's @Autowired。该类有许多非静态的私有实例方法。它们不使用任何实例字段,仅适用于方法参数。

我可以安全地将这些方法作为public static移动到某个单独的实用程序类中吗?有什么缺点?

4 个答案:

答案 0 :(得分:63)

“错误的”心态。

你不会修改你的课程,因为工具正在抱怨这个或那个。

您希望改善源代码的质量;这些工具可以帮助识别“值得思考的主题”。您将其反馈视为提示;不是“订单”。

因此,您不必担心课程中的“代码行”。相反,您担心此类具有的职责。含义:行号计数本身不是问题 - 但违反Single Responsibility Principle的行为是。

因此:你退后一步,查看你班级到底在做什么。当它显然不止一件事时,你将这些方面提取到其他类中!

含义:如果您确实发现所有这些代码都“属于”该类的责任;然后把它留在那里。不要开始将内部实现细节放入不相关的帮助程序类中;只是因为某些工具会警告你行数。

另一方面,将私有方法转换为静态/包保护的东西将允许您对这些方法进行单元测试。这可能是一个优势。但正如所说:只要我们谈论实施细节,他们应该保持私密;并且它们不应该进行单元测试。

长篇代码:了解并理解“干净代码”的含义;并尝试遵循那里概述的想法。

答案 1 :(得分:4)

方法的划分应该是目的/应用/逻辑(你的名字),而不是技术属性。

长源代码可能可以分成几个小的类,每个类都有自己独立的目的/责任。

答案 2 :(得分:3)

代码质量无法通过行数来衡量。如果您发现类文件日益增长,请确保您的课程遵循单一责任原则。

当你的班级不遵循原则时,将他们分成不同的班级,并将班级变成一个包。

否则,您可以将基类设为abstract class,并将您的util方法设为abstract。有一个子类,它扩展了基类,为基类中的抽象方法提供了实现。

这是一个很好的SO answer on when you could make your methods as static

正如@Zack Jannsen所说,

  经常“静止”   当你知道某些东西不会改变时,这是有价值的   实例。如果是这种情况,我会真的考虑“单身   责任原则“,这意味着一个班级应该有一个   责任,因此只有一个改变的理由。我觉得应该   考虑移动“ConvertMpgToKpl(双mpg)”函数,和   类似的方法,给自己的班级。汽车对象的目的是   允许实例化汽车,不提供它们之间的比较。   那些应该是课外的。

尽管static允许您在没有创建对象的情况下访问该方法,但在尝试将该方法设置为静态时始终要记住以下内容

  • 该方法根据输入参数
  • 生成一致的结果
  • 你总是需要那个方法在内存中(即;你经常需要这个方法) - 访问一个巨大的方法可能会更好,在方法创建的帮助下,这个方法只能被访问很少次而不是访问它通过static
  • 经常使用的实用程序方法可以作为static

答案 3 :(得分:2)

我经常使用包含静态方法的Utility类,并且发现它非常方便。如果这些方法仅供单个类使用,则可以将Utility类作为静态私有类放在原始类中。但是我发现在很多情况下,一些静态实用程序方法可以被几个类使用,所以在这种情况下我创建一个单独的实用程序类,其中包含一组可以由几个类使用的静态方法。

另外,我非常赞同GhostCat在一般思维方式上的答案。至于班级的规模 - 这可能是一个问题,但通常我不担心这么多。我真正寻找的是你的方法的大小。我喜欢简短和自我解释的方法,从名称和参数名称和顺序以及逻辑开始。如果有大块内部逻辑 - 将其提取到单独的方法中。这使代码更易于阅读和维护。