Kotlin的DAO应该返回Optional还是null?
在Kotlin / JPA之前,我曾经写过这样的DAO层:
public interface UserDao extends JpaRepository { Optional findBySsn(String ssn); }
而在来电方,如果我想通过SSN找人或创建用户,我可以这样写:
val user = userDao.findBySsn(value).orElseGet { userDao.save(value) }
它运作良好,看起来流利。
但是,由于Kotlin引入了无效安全,所以还有另外一种惯用的方式(Java中的dao):
public interface UserDao extends JpaRepository { Optional findBySsn(String ssn); @Query("select u from User u where u.ssn = :ssn") @Nullable User findBySsnNullable(@Param("ssn") String ssn) }
而在客户端:
val user = userDao.findBySsnNullable(value) .takeIf{ it -> it != null}? : userDao.save(User(value))
两种方式都很好。 但是我想知道哪个是首选? Kotlin是否依赖于Java8的Optional
API设计? Kotlin项目依赖(或相互通信)Java8的Optional
/ Stream
API(因为Kotlin有它自己的)有什么缺点?
Kotlin可以编译成JavaScript(我没有研究过)。 如果该项目是依赖于Java的Optional
/ Stream
,将有问题编译到JS?
– – 更新 – –
根据Jetbrains
不,通用代码只能依赖于其他通用库。 Kotlin不支持将Java字节码转换为JS。
如果你不需要,我不会使用Optional
。 它只会增加不必要的开销,因为使用可空types在Kotlin中更具可读性和更习惯。 在Kotlin中使用Optional
没有任何优势。
这是另一个讨论: https : //discuss.kotlinlang.org/t/java-api-design-for-kotlin-consumption-optional-or-null/2455