Spring规范的谓词应该是静态的吗?
弹簧是静态的还是非静态的
默认实现类似于以下内容:
public static Specification<Customer> byCustomerName(String name) {
return new Specification<Customer>() {
@Override
public Predicate toPredicate(Root<BasePricingCache> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.equal(root.get(Customer_.name), name);
}
};
}
但这也可以重构为:
private static final CUSTOMER_SPEC = return new Specification<Customer>() {
@Override
public Predicate toPredicate(Root<BasePricingCache> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.equal(root.get(Customer_.name), name);
}
};
public static Specification<Customer> byCustomerName(String name) {
return CUSTOMER_SPEC;
}
应该选择什么?Specification
的线程安全吗?可以这样使用吗
# 1 楼答案
重构后的代码甚至无法编译。有一个多余的返回,
CUSTOMER_SPEC
没有类型,您引用的是范围中不存在的name
变量我认为你在这里想得太多了,正在进行微观优化。将
Specification
保存在静态工厂方法中应该很好# 2 楼答案
Threadsafety在这里的实现不会引起关注。您根本不保留任何状态,每个参数都由调用方传递
这可能是微观优化,但重构将非常有用,例如当规范发生大量实例化时。这可能过于频繁地触发GC,导致响应速度明显滞后
这种微优化的缺点可能是,由于无法对实例进行GC'ed,您最终可能需要大量内存
首先通过收集数据(分析堆…)来支持您的决策并测试您的解决方案对应用程序的影响