我最近在Java中进行了一个中型项目的重构,以返回并添加单元测试。当我意识到模拟单例和静态模型是多么痛苦时,我终于“明白了”我一直以来一直在阅读的内容。(我是需要从经验中学习的人之一。哦。)
因此,既然我正在使用Spring创建对象并将它们连接在一起,那么我就不用去左右static
关键字了。(如果我有可能要模拟它,那么它在与Math.abs()相同的意义上并不是真正的静态,对吧?)问题是,我已经习惯于使用static
来表示方法不依赖在任何对象状态下。例如:
//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
public static Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
public Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
thirdPartyFactoryInstance.newThingy(input);
因此,这就是敏感的地方。我喜欢旧方法,因为大写字母告诉我,就像Math.sin(x)一样,ThirdPartyLibraryWrapper.newThingy(x)每次都以相同的方式执行相同的操作。没有对象状态可以更改对象执行我要执行的操作的方式。这是我正在考虑的一些可能的答案。
- 没有其他人有这种感觉,所以我有问题。也许我只是还没有真正内部化OO的做事方式!也许我在用Java编写,但在FORTRAN或类似语言中思考。(由于我从未写过FORTRAN,这会给人留下深刻的印象。)
- 也许出于论证代码的目的,我正在使用静态作为不变性的一种代理。话虽这么说,有什么线索 要我在我的人一起,以保持它的到来代码知道什么是有状态的,什么不是?
- 如果我选择好的对象隐喻,也许应该只是免费提供?例如
thingyWrapper
,听起来好像它的包装状态是独立的,而包装状态Thingy
本身可能是可变的。同样,thingyFactory
听起来应该是不变的,但在创建时可能会选择不同的策略。