几个月前,我开始从事一个新项目,在遍历代码时,它使我震惊了所使用的静态方法。它们不仅保留了实用程序方法collectionToCsvString(Collection<E> elements)
,而且还保留了大量业务逻辑。
当我问负责背后原因的那个人时,他说这是逃避斯普林暴政的一种方式。它围绕着这个思考过程进行了一些操作:要实现客户收据创建方法,我们可以提供服务
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
现在,那个家伙说他不喜欢让Spring不必要地管理类,主要是因为它强加了限制,即客户类必须是Spring bean本身。我们最终将一切都由Spring管理,这几乎迫使我们以过程方式使用无状态对象。或多或少在这里说了什么https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
因此,除了上面的代码,他有
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
我可以说要避免在可能的情况下避免Spring管理我们的类,但是我看不到使所有内容保持静态的好处。这些静态方法也是无状态的,所以也不是很OO。我会更喜欢
new CustomerReceiptCreator().createReceipt()
他声称静态方法有一些额外的好处。即:
- 更容易阅读。导入静态方法,我们只需要关心该动作,而无需执行任何类。
- 显然,它是一种无需进行DB调用的方法,因此在性能上很便宜;弄清楚是一件好事,以便潜在客户确实需要进入代码并进行检查。
- 编写测试更容易。
但是我只是觉得有些不对劲,所以我想听听一些经验丰富的开发者对此的想法。
所以我的问题是,这种编程方式的潜在陷阱是什么?
static
上面说明的方法只是普通的工厂方法。由于许多令人信服的原因,使工厂方法静态化是普遍接受的约定。这里的工厂方法是否合适是另一回事。