如何解决何时在构造函数中使用静态传递的引用来共享我想共享的东西?
一个主题不清楚,我将尝试通过一个简单的例子来解释我的问题。我们知道银行的所有客户都分享银行的钱。因此,如果银行破产,则任何客户都不能贷款。基于这种观点,我将尝试编写一个简单的程序。
方法1:
<p>
方法2:
div[@id="unique"]//span[contains(./text()[1],"uniqueText")]/ancestor::div[1]/div[contains(.//p/text(),"$")]//p/text()
当然,逻辑不是100%涵盖的,但我想我已经表明了我的观点。有人在编码时应该遵循经验法则吗?共享某物(金钱)时,什么时候应该使用static;何时再次共享同一物(金钱),何时应该在构造函数中传递引用?
解决方法
在几乎所有情况下,首选方法2。与方法1相比,它具有许多明显的优势。
- 测试方法2容易得多。您可以传递模拟的
SharedMoney
,其行为完全符合测试要求(例如,有特定金额)。 - 它允许您将与那些对象相关的方法添加到
SharedMoney
类中,而不是在Client
中以与该类的职责无关的静态方法结束 - 静态变量包含全局状态。全局状态是任何程序状态都可能可供任何代码访问或更改。每当您具有全局状态时,都会引入一种不相关的方法更改该状态的可能性,这种状态具有意外的副作用,这会使代码变得不可预测且易于检测到错误。尽可能避免全局状态。替代方案通常是依赖注入,您的方法2是一个很好的例子。
在Why are static variables considered evil?的答案中对这些主题进行了详细讨论,但是请注意,在很多讨论中,实际上都是关于可变静态变量的。常量值(通常声明为private static final
,并且按照惯例使用大写字母名称)没有相同的缺点,因为可以依赖其值而无需更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。