Thắc mắc về Kotlin và Java

Chào mọi người, mình có đang tìm hiểu về Kotlin và mình cũng có kiến thức Java từ trước rồi. Sau thời gian tìm hiểu thì mình thấy khá thắc mắc về bức hình này. Đây là bức hình so sánh giữa Kotlin và Java

Giả sử biến book là 1 biến Book
Như bức trên thì để get và set title thì java dùng book.getTitle() và book.setTitle(String title)
Còn Kotlin thì get và set đều là book.title ?
Theo như mình biết thì getter và setter trong Java nhằm mục đích tránh thao tác trực tiếp với biến. Vậy thì Kotlin cải tiến hơn thì cụ thể như nào
Mình vẫn còn non nớt trong lĩnh vực này nên ai biết thì giúp mình
Nhân tiện mình muốn lập một nhóm chat nhỏ để trao đổi về lĩnh vực code Android, bạn nào có hứng thú thì liên hệ mình

Trên offficial docs có giải thích nè
https://kotlinlang.org/docs/reference/data-classes.html

2 Likes

Trong Java có một khái niệm ngầm là data class. Các class này chỉ nhằm mục đích là nắm dữ các giá trị dữ liệu (thuộc tính) ví dụ như model, entity… Các class này có chung đặc điểm là dựa vào tập hợp các thuộc tính mà nó chứa để có tương ứng constructor cũng như setter và getter… (Còn các kiểu hash, toString nữa)

Kotlin đơn giản là tạo ra một syntax sugar cho các class kiểu như vậy và đặt tên cho nó là data class.

Kotlin cho bạn viết getter , setter mà , còn trường hợp này dùng khi bạn ko cần getter setter (trong Java bạn có thể sử dụng lombok làm chuyện này). Còn điểm hơn thì thấy khá rõ là data object nó ngắn hơn (ai viết DTO hay entity nhiều sẽ biết) , constructor cũng gọn hơn và val/var giới hạn khả năng thay đổi dữ liệu tránh lỗi. Không rõ bạn cần support gì về Kotlin , bạn có thể tham gia diễn đàn vnkotlin.com , bên mình cũng có người support android nữa nếu cần có thể tạo group chat

Ý mình là ở trên bức hình kia 1 bên là Java 1 bên là Kotlin
Có lẽ tác giả muốn nói 2 cách code kia là tương đồng nhau với 2 ngôn ngữ khác nhau để thể hiện sự tiện lợi của Kotlin
Nhưng mình thấy nó không thực sự tương đồng nhau. Java set value thì book.setTitle(,) còn Kotlin thì book.title = ?. Theo mình thì book.title đã thao tác trực tiếp với biến còn Java thì không
Đó là suy nghĩ của mình, mình cho rằng 2 bức 2 bên không tương đồng nhau

Mình thấy bạn chưa hiểu rõ chỗ này :

class Book(var title:String, var author:String)
var book:Book = Book("","")
        book.title = "Kotlin"
        book.author = "JetBrain"

thì khi ở Java nó sẽ thế này :

Book book = new Book("", "");
      book.setTitle("Kotlin");
      book.setAuthor("JetBrain");

chứ Kotlin ko gán trực tiếp attributes như bạn nghĩ đâu. Bạn có thể viết thử đoạn code này trong Kotlin và dùng tool trong IntelliJ decompile sẽ thấy

1 Like

Mình thắc mắc thế này:
Nếu trong class Book của java không có phương thức set, thì đoạn code trên sao tương đương với nhau.
Vì kotlin vẫn có thể set được giá trị cho book thông qua book.title, book.author, còn java thì không thể set được.
Bạn giải thích giùm với.

Mình đã thử test trên IDE thì phát hiện như sau:
Khi Book không có setter/getter: Kotlin sẽ gọi trực tiếp vào field.
Khi Book có getter/setter và public field: Kotlin sẽ gọi trực tiếp vào field.( Lúc này nếu bạn dùng book.set… hoặc book.get… thì IDE sẽ không suggest chuyển sang cú pháp property access syntax)
Khi Book có getter/setter và private field: Kotlin sẽ gọi getter/setter ( Lúc này nếu bạn dùng book.set… hoặc book.get… thì IDE sẽ suggest chuyển sang cú pháp property access syntax)
Ngoài ra nếu bạn để ý thì khi access field hay property bên Java thì cách hiển thị từ IDE sẽ khác:
Property:

Field:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?