java - 如何避免if-else树代码?

标签 java spring rest

我有一个休息 Controller ,其中包含一种根据“标题”和“作者”参数查找书籍的方法。

你能告诉我如何摆脱 if-else 结构吗? 现在并不复杂,但将来参数的数量可能会增加,这将导致一团糟。

    @GetMapping
    public ResponseEntity<List<Book>> searchBooksByTitleAndAuthor(
            @RequestParam(value = "title", required = false) String title,
            @RequestParam(value = "author", required = false) String author) {

        if (title == null && author == null) {
            log.info("Empty request");
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else if (title != null && author == null) {
            log.info("Retrieving books by title");
            List<Book> books = bookService.getBooksByTitle(title);
            if (books.isEmpty()) {
                log.info("No books with this title");
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }
            return new ResponseEntity<>(books, HttpStatus.OK);
        } else if (author != null && title == null) {
            List<Book> books = bookService.getBooksByTitle(title);
            if (books.isEmpty()) {
                log.info("No books with this title");
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }
            return new ResponseEntity<>(books, HttpStatus.OK);
        } else {
            List<Book> books = bookService.getBooksByTitleAndAuthor(title, author);
            if (books.isEmpty()) {
                log.info("No books with matching this title and author");
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }
            return new ResponseEntity<>(books, HttpStatus.OK);
        }

    }

最佳答案

由于您的计划是最终支持更多参数,因此最好的选择可能是查看 Hibernate's Criteria class .这允许您动态构造查询。它不会避免 if 语句,但它避免else 语句并使支持新参数变得非常容易。在您的存储库/DAO 级别:

Criteria criteria = session.createCriteria(Book.class);
if (author != null && !author.isEmpty()) {
    criteria.add(Restriction.eq("author", author));
}
if (title != null && !title.isEmpty()) {
    criteria.add(Restriction.eq("title", title));
}
criteria.addOrder(Order.asc("publishDate"));
return (List<Book>) criteria.list();

这有一些显着的好处:

  1. 要支持新参数,您只需将参数添加到 Controller ,然后将参数向下传递到存储库,并将参数添加到此 block 。

  2. 您最终可以使您的排序可配置,例如:

    ?sort=title:asc&author=Bobby%20Tables

但是,也有一些缺点,最明显的是它依赖于字符串值来引用您的属性。如果您的属性名称更改(请注意这是 POJO 属性,而不是数据库列名称),那么此代码将需要更改。然而,我认为这是一种非常罕见的情况,除非在最新的新项目中,数据库模式仍在不断变化,并且在数据库模式建立之后,这种缺点很少会导致问题。

另一个提示,一旦你输入了一定数量的参数(例如 4-5),创建 a parameter object将您的参数包装到一个可以传递的漂亮对象中。

关于java - 如何避免if-else树代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50064574/

相关文章:

java - 在多对一映射中映射 Hibernate 列并作为属性

java - 如何知道 Groovy 控制台窗口已关闭

java - Spring配置文件不从application.properties读取值

java - 初始化@EJB字段

java - 使用 jersey-Rest 的 Post 方法并从 url 获取参数

json - REST API 最佳实践 : args in query string vs in request body

java - 从断言中获取日志消息

java - 贾克斯B : is it recommended to use JAXB to get java objects from xml in non-webservice project

java - Spring @ModelAttribute 将格式化数字转换为 Double

ios - RestKit映射: map different objects at once