Vor Kotlin/JPA, benutzte ich meine DAO Schicht so schreiben:Sollte Kotlins DAO optional oder null zurückgeben?
public interface UserDao extends JpaRepository<User,Long> {
Optional<User> findBySsn(String ssn);
}
Und in der Anruferseite, wenn ich jemanden finden wollen oder erstellen Benutzer von SSN, ich kann schreiben:
val user = userDao.findBySsn(value).orElseGet {
userDao.save(value)
}
Es funktioniert gut und sieht fließend.
Aber da Kotlin stellt null-Sicherheit gibt es eine weitere idiomatische Weg ist (dao noch in Java):
public interface UserDao extends JpaRepository<User,Long> {
Optional<User> findBySsn(String ssn);
@Query("select u from User u where u.ssn = :ssn")
@Nullable User findBySsnNullable(@Param("ssn") String ssn)
}
Und in der Client-Seite:
val user = userDao.findBySsnNullable(value)
.takeIf{ it -> it != null}? : userDao.save(User(value))
Beide Wege gut arbeiten. Aber ich frage mich, welches ist bevorzugt? Ist es für Kotlin gut, abhängig von Java8 Optional
in API-Design? Welche Nachteile hat ein Kotlin-Projekt, wenn es sich auf Java8s Optional
/Stream
API stützt (oder mit ihr kommuniziert) (da Kotlin seine eigene hat)?
Kotlin kann auf JavaScript kompilieren (ich habe das nicht untersucht). Wenn das Projekt von Javas Optional
/Stream
abhängt, wird es Probleme beim Kompilieren von JS geben?
---- ---- aktualisiert
Nach Jetbrains
Nein, gemeinsamer Code nur auf anderen gemeinsamen Bibliotheken abhängen. Kotlin hat keine Unterstützung für die Übersetzung von Java-Bytecode in JS.
[An 'Optional' Platz in Kotlin] (https://medium.com/square-corner-blog/an-optionals-place-in-kotlin- 17d7b271eefe) - wenn es nicht erforderlich ist, sind Nullable-Typen definitiv die idiomatische Lösung – Moira
In Ihrem Beispiel müssen Sie nicht einmal den "takeIf" -Teil verwenden. Es wird dasselbe auch ohne sein. – tynn
Danke @tynn ... – smallufo