Spring 规范的谓词应该是静态的吗?
Should Predicates of Spring Specification be static?
Predicate
个弹簧 Specification
应该是静态的还是非静态的?
默认实现类似于以下内容:
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
s 是线程安全的并且可以这样使用吗?
你重构的代码甚至无法编译。有一个多余的 return,CUSTOMER_SPEC
没有类型,您指的是范围内不存在的 name
变量。
我认为您对这里的问题想得太多了,并且正在进行微观优化。将 Specification
保留在静态工厂方法中应该没问题。
这里的实现不会考虑线程安全。你根本不保留任何状态,每个参数都由调用者传递。
它可能是微优化,但您的重构会很有用,例如当规范发生大量实例化时。这可能会过于频繁地触发 GC,从而导致响应明显滞后。
这些微优化的缺点可能是您最终可能会遇到相当大的内存需求,因为实例无法进行 GC。
首先通过收集数据(分析堆,...)来支持您的决定并测试您的解决方案对应用程序的影响。
Predicate
个弹簧 Specification
应该是静态的还是非静态的?
默认实现类似于以下内容:
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
s 是线程安全的并且可以这样使用吗?
你重构的代码甚至无法编译。有一个多余的 return,CUSTOMER_SPEC
没有类型,您指的是范围内不存在的 name
变量。
我认为您对这里的问题想得太多了,并且正在进行微观优化。将 Specification
保留在静态工厂方法中应该没问题。
这里的实现不会考虑线程安全。你根本不保留任何状态,每个参数都由调用者传递。
它可能是微优化,但您的重构会很有用,例如当规范发生大量实例化时。这可能会过于频繁地触发 GC,从而导致响应明显滞后。
这些微优化的缺点可能是您最终可能会遇到相当大的内存需求,因为实例无法进行 GC。
首先通过收集数据(分析堆,...)来支持您的决定并测试您的解决方案对应用程序的影响。