我有一个休息 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();
这有一些显着的好处:
要支持新参数,您只需将参数添加到 Controller ,然后将参数向下传递到存储库,并将参数添加到此 block 。
您最终可以使您的排序可配置,例如:
?sort=title:asc&author=Bobby%20Tables
但是,也有一些缺点,最明显的是它依赖于字符串值来引用您的属性。如果您的属性名称更改(请注意这是 POJO 属性,而不是数据库列名称),那么此代码将需要更改。然而,我认为这是一种非常罕见的情况,除非在最新的新项目中,数据库模式仍在不断变化,并且在数据库模式建立之后,这种缺点很少会导致问题。
另一个提示,一旦你输入了一定数量的参数(例如 4-5),创建 a parameter object将您的参数包装到一个可以传递的漂亮对象中。
关于java - 如何避免if-else树代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50064574/