有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的线程安全吗?可以这样使用吗


共 (2) 个答案

  1. # 1 楼答案

    重构后的代码甚至无法编译。有一个多余的返回,CUSTOMER_SPEC没有类型,您引用的是范围中不存在的name变量

    我认为你在这里想得太多了,正在进行微观优化。将Specification保存在静态工厂方法中应该很好

  2. # 2 楼答案

    Threadsafety在这里的实现不会引起关注。您根本不保留任何状态,每个参数都由调用方传递

    这可能是微观优化,但重构将非常有用,例如当规范发生大量实例化时。这可能过于频繁地触发GC,导致响应速度明显滞后

    这种微优化的缺点可能是,由于无法对实例进行GC'ed,您最终可能需要大量内存

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