如果在链过滤中检查null,则重构和删除

时间:2013-12-05 10:31:29

标签: java if-statement filtering chain-of-responsibility null-check

我正在对数据库条目进行一些过滤,最后我得到了一些我不喜欢的丑陋代码。

我有MyFilterResolverFactory课,我建立并返回我的MyFilterResolver链。

public abstract class MyFilterResolver {
    protected MyFilterResolver nextResolver = EMPTY;
    protected List<Predicate> predicates;

    public List<Predicate> resolve(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
        this.predicates = new ArrayList<Predicate>();

        resolveFilter(filter, cb, root);

        this.predicates.addAll(this.nextResolver.resolve(filter, cb, root));
        return this.predicates;
    }

    protected abstract void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root);

    public void attachNextResolver(MyFilterResolver nextResolver) {
        this.nextResolver = nextResolver;
    }

    public static MyFilterResolver EMPTY = new MyFilterResolver() {

        @Override
        public List<Predicate> resolve(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
            return new ArrayList<Predicate>();
        }

        @Override
        protected void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
        }
    };
}

这是一个丑陋的具体实现:

public class MyDateFilterResolver extends
    MyFilterResolver {

    @Override
    protected void resolveFilter(MyFilter filter, CriteriaBuilder cb,
        Root<MyEntity> root) {

        if (filter != null) {
            Date dateExact = filter.getDateExact();
            Date dateAfter = filter.getDateAfter();
            Date dateBefore = filter.getDateBefore();

            if (dateExact != null) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(dateExact);

                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, 0);

                Date dayStart = calendar.getTime();

                calendar = Calendar.getInstance();
                calendar.setTime(dayStart);
                calendar.add(Calendar.DATE, 1);
                calendar.add(Calendar.MILLISECOND, -1);

                Date dayEnd = calendar.getTime();

                super.predicates.add(
                    cb.greaterThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dayStart
                    )
                );

                super.predicates.add(
                    cb.lessThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dayEnd
                    )
                );

            }

            if (dateAfter != null) {
                super.predicates.add(
                    cb.greaterThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dateAfter
                    )
                );
            }

            if (dateBefore != null) {
                predicates.add(
                    cb.lessThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dateBefore
                    )
                );
            }
        }
    }

}

MyFilter class是一个只有getter / setter的常规POJO。

我想摆脱这些if (something != null)支票,但我无法看清楚。

1 个答案:

答案 0 :(得分:0)

我认为没有任何理由。一个(差)替代方案是使用一个try / catch,但if语句对于在这里使用它们的任务更清晰,性能更好。