2017-05-25 4 views
0

Ich habe ein Repository-Klasse wie folgt aus:wie NULL-Prüfung zu vermeiden

interface TodosRepository : CrudRepository<Todo, Long> { 
    fun findByUid(uid: String): Todo? 
} 

und ein Verfahren, das diese todo als erledigt markieren können:

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 fragen Sie mich das todo == null mit einem ersetzen elvis Betreiber:

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) 

aber dann fragt es mir die nULL-Prüfung zu verwenden, wenn sie den Status auf 1 wit Einstellung h todo?.status = 1 die Sache ist, dass ich denke, dass es mich nicht fragen sollte, denn an diesem Punkt bin ich mir ziemlich sicher, dass todo nicht mehr null ist.
Gibt es eine Workaround oder ich vielleicht etwas auf Kotlin missverstanden?

Antwort

4

Ich glaube, Sie könnten die Variable nicht Nullable machen, um dies zu beheben. Wahrscheinlich auch eine val.

val todo: Todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND) 

Edit: den Rückgabetyp Weglassen sollte auch arbeiten, um die Nicht-Nullable-Todo Typ abzuleiten.

Die automatische Änderung, die IntelliJ vorgeschlagen hat, hätte reibungslos funktioniert, wenn Sie keinen expliziten Typ hätten; Es sieht so aus, als ob es sich dafür entschieden hätte, es unverändert zu lassen, anstatt es in ein Nicht-Nullable zu ändern, was den Zweck des Hinweises etwas zunichte macht.

val todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND) 
+0

aber 'findByUid' gibt null zurück, wenn es nicht –

+0

gefunden Wenn es null zurückgibt, dann wird das Verfahren sofort vom elvis Betreiber zurück. – Naetmul

+1

Das sollte kein Problem sein, wenn Sie '?:' Danach verwenden. In der Tat können Sie versuchen, den expliziten Typ ganz wegzulassen, ich denke, Sie werden "Todo" abgeleitet bekommen. – zsmb13

Verwandte Themen