如何避免无效检查
问题描述:
我有一个仓储类是这样的:如何避免无效检查
interface TodosRepository : CrudRepository<Todo, Long> {
fun findByUid(uid: String): Todo?
}
,并且可以标记该待办事项为完成一个方法:
fun markAsDone(uid: String): ResponseEntity<String> {
var todo = todosRepository.findByUid(uid)
if(todo == null){
return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
}
todo.status = 1
todosRepository.save(todo)
return ResponseEntity.ok("Saved")
}
的IntelliJ问我更换todo == null
用elvis运算符:
fun markAsDone(uid: String): ResponseEntity<String> {
var todo: Todo? = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
todo.status = 1
todosRepository.save(todo)
但后来,它要求我在将状态设置为1时使用空检查h todo?.status = 1
事情是,我认为它不应该问我,因为在那一点上,我非常肯定todo
不是null了。
有什么解决方法,或者我可能误解了Kotlin上的某些东西?
答
我相信你可以使变量不可为空来解决这个问题。可能也是val
。
val todo: Todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
编辑:省略返回类型也应努力推断非空的Todo
类型。
如果您没有明确的类型,IntelliJ建议的自动更改将顺利进行;它似乎选择保持它不被修改,而不是将其更改为不可空,这有点破坏了提示的目的。
val todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
但如果没有找到 –
它,如果它返回null'findByUid'返回null,则该方法将立即被猫王操作返回。 – Naetmul
如果你在后面使用':',这应该不成问题。事实上,你可以尝试完全省略显式类型,我想你会得出'Todo'推断。 – zsmb13