2017-11-28 16 views
6

Trước Kotlin/JPA, tôi sử dụng để viết lớp DAO của tôi như thế này:Có nên trả lại DAO của Kotlin hay không?

public interface UserDao extends JpaRepository<User,Long> { 
    Optional<User> findBySsn(String ssn); 
} 

Và ở phía người gọi, nếu tôi muốn tìm một người nào đó hoặc tạo người dùng bằng cách SSN, tôi có thể viết này:

val user = userDao.findBySsn(value).orElseGet { 
    userDao.save(value) 
} 

Nó hoạt động tốt và trông thạo.

Nhưng kể từ Kotlin giới thiệu null-an toàn, có một cách khác thành ngữ (dao vẫn trong 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) 
} 

Và ở phía khách hàng:

val user = userDao.findBySsnNullable(value) 
     .takeIf{ it -> it != null}? : userDao.save(User(value)) 

Cả hai cách làm việc tốt. Nhưng tôi tự hỏi cái nào được ưa thích hơn? Có tốt cho Kotlin phụ thuộc vào thiết kế API Optional của Java8 không? Điểm yếu của dự án Kotlin là phụ thuộc vào (hoặc liên lạc thông qua) API Optional/Stream của Java8 (vì Kotlin có riêng)?

Kotlin có thể biên dịch sang JavaScript (Tôi chưa nghiên cứu). Nếu dự án phụ thuộc vào số Optional/Stream của Java, nó có vấn đề khi biên dịch sang JS không?

---- cập nhật ----

Theo Jetbrains

Không, mã phổ biến chỉ có thể phụ thuộc vào các thư viện phổ biến khác. Kotlin có không hỗ trợ dịch mã Java bytecode thành JS.

+0

[Một 'Optional' của nơi ở Kotlin] (https://medium.com/square-corner-blog/an-optionals-place-in-kotlin- 17d7b271eefe) - khi không cần thiết, các kiểu nullable chắc chắn là giải pháp thành ngữ hơn – Moira

+2

Trong ví dụ của bạn, bạn thậm chí không phải sử dụng phần 'takeIf'. Nó sẽ là như nhau mà không có tốt. – tynn

+0

Xin cảm ơn @tynn ... – smallufo

Trả lời

Các vấn đề liên quan