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;
}

应该优先选择什么? Specifications 是线程安全的并且可以这样使用吗?

你重构的代码甚至无法编译。有一个多余的 return,CUSTOMER_SPEC 没有类型,您指的是范围内不存在的 name 变量。

我认为您对这里的问题想得太多了,并且正在进行微观优化。将 Specification 保留在静态工厂方法中应该没问题。

这里的实现不会考虑线程安全。你根本不保留任何状态,每个参数都由调用者传递。

它可能是微优化,但您的重构会很有用,例如当规范发生大量实例化时。这可能会过于频繁地触发 GC,从而导致响应明显滞后。

这些微优化的缺点可能是您最终可能会遇到相当大的内存需求,因为实例无法进行 GC。

首先通过收集数据(分析堆,...)来支持您的决定并测试您的解决方案对应用程序的影响。