如何避免空检查

时间:2017-05-25 13:00:48

标签: intellij-idea kotlin

我有一个像这样的存储库类:

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让我用elvis操作符替换todo == null

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)

然后,它要求我在使用todo?.status = 1将状态设置为1时使用空检查 问题是我认为它不应该问我,因为在那一点上,我很确定todo不再是空的。
是否有任何解决方法,或者我可能在Kotlin上误解了什么?

1 个答案:

答案 0 :(得分:4)

我相信你可以让变量不可为空来解决这个问题。可能还是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)