I, Lời mở đầu
- Nếu bạn là 1 lập trình viên Android, bạn sẽ chọn ngôn ngữ nào Java hay Kotlin ? Đừng lo về vấn đề đó vì mỗi ngôn ngữ sẽ có những thế mạnh riêng.
- Chúng ta đều biết rằng cả Java và Kotlin đều chạy trên JVM.
- Một class Kotlin đều có thể compile ra một class Java thông qua
Kotlin compiler. Nếu sử dụng Android Studio thì Kotlin compiler sẽ compileTest.ktclass thànhTest.javaclass. - Đôi khi chúng ta muốn sử dụng những feature của Java hoặc sử dụng Kotlin code ở trong Java file để tối ưu performance cho JVM.
- Trong bài viết này, chúng ta sẽ đi tìm hiểu về vấn đề này thông qua 3 annotation:
@JvmStatic,@JvmOverloadsvà@JvmField.
II, @JvmStatic
- @JvmStatic là 1 annotation chỉ dùng trong
objectvàcompanion object class: trong java compiled file, Kotlin compiler sẽ compile các member:- Function: thành 1 static method trong Java class.
- Property: thành 1 static variable và getter/setter method cho static variable đó trong Java class.
- Ví dụ 1:
1 | object JvmStaticTest { |
- Sử dụng Kotlin compiler để compile Kotlin class sang Java class, chúng ta được kết quả:
1 | public final class AnnotationTest { |
- Kotlin compiler compile
AnnotationTestobject class thànhAnnotationTest.javaclass. Chúng ta thấy:- Property
viewtrong AnnotationTest object ⇔ propertyviewvà 2 static functiongetView()/setView()trong AnnotationTest.class. - Function
doSomething()trong AnnotationTest object ⇔ static functiondoSomething()trong AnnotationTest.java.
- Property
II, @JvmOverloads
@JvmOverloads là 1 annotation áp dụng cho function hoặc constructor: trong java compiled file, Kotlin compiler tạo ra các overloading function dựa trên các default parameter values của function gốc.
Nếu một method có
Nparameter vàMparameter có giá trị mặc định thìMoverload function sẽ được sinh ra:- Overloading function thứ 1 có
N - 1parameter. Body của nó là gọi lại function gốc vớiN - 1parameter đầu tiên và default value của parameter của parameter cuối cùng. - Overloading function thứ 2 có
N - 2parameter. Body của nó là gọi là function gốc vớiN - 2parameter đàu tiên và default value của hai parameter cuối cùng. - …
- Overloading function thứ 1 có
Ví dụ 2: annotate constructor của class
DialViewvới@JvmOverloads.
1 | class DialView constructor( |
- Constructor trong Kotlin class có 3 parameter và 2 default parameter value. Do đó chúng ta sẽ có 2 overloading constructor.
- Khi không sử dụng
@JvmOverloads, classDialViewđược viết lại như sau:
1 | class DiaView: View { |
- Ví dụ 3: annotate function
doJvmOverloadsFunction()của classJvmOverloadsTestvới@JvmOverloads
1 | class JvmOverloadsTest { |
- Nếu không sử dụng
@JvmOverloads, chúng ta có thể viết lạiJvmOverloadTestnhư sau:
1 | class JvmOverloadsTest { |
III, @JvmField
- @JvmField là một annotation được sử dụng cho câc field (property, parameter): trong java complied file, kotlin compiler sẽ không sinh ra method getter và setter cho variable, việc thực hiện get và set sẽ thông qua chính variable đó.
- Do việc thực hiện get và set đều thông qua variable nên field đó là property thì nó không được có visibility modifier là
private. - Annotation
@JvmFieldcó nhiều ý nghĩa hơn khi chúng ta sử dung một field của Kotlin class trong 1 Java class. Hãy xem xét ví dụ 4 và 5 để làm rõ hơn. - Ví dụ 4:
1 | class JvmFieldTest { |
- Khi bạn muốn sử dụng
testtrong Java classTest.java:
1 | public class Test { |
- Ví dụ 5: Viết lại ví dụ 4 và annotate
testvớiJvmField
1 | class JvmFieldTest { |
- Khi bạn muốn sử dụng
testtrong Java classTest.java:
1 | public class Test { |