“静态”作为关于无状态的语义线索?
我最近在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听起来应该是不变的,但在创建时可能会选择不同的策略。