2017-05-25 83 views
0

我有一個倉儲類是這樣的:如何避免無效檢查

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上的某些東西?

回答

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) 
+0

但如果沒有找到 –

+0

它,如果它返回null'findByUid'返回null,則該方法將立即被貓王操作返回。 – Naetmul

+1

如果你在後面使用':',這應該不成問題。事實上,你可以嘗試完全省略顯式類型,我想你會得出'Todo'推斷。 – zsmb13