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.kt
class thànhTest.java
class. - Đô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
,@JvmOverloads
và@JvmField
.
II, @JvmStatic
- @JvmStatic là 1 annotation chỉ dùng trong
object
và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
AnnotationTest
object class thànhAnnotationTest.java
class. Chúng ta thấy:- Property
view
trong AnnotationTest object ⇔ propertyview
và 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ó
N
parameter vàM
parameter có giá trị mặc định thìM
overload function sẽ được sinh ra:- Overloading function thứ 1 có
N - 1
parameter. Body của nó là gọi lại function gốc vớiN - 1
parameter đầu tiên và default value của parameter của parameter cuối cùng. - Overloading function thứ 2 có
N - 2
parameter. Body của nó là gọi là function gốc vớiN - 2
parameter đà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
DialView
vớ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 classJvmOverloadsTest
với@JvmOverloads
1 | class JvmOverloadsTest { |
- Nếu không sử dụng
@JvmOverloads
, chúng ta có thể viết lạiJvmOverloadTest
như 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
@JvmField
có 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
test
trong Java classTest.java
:
1 | public class Test { |
- Ví dụ 5: Viết lại ví dụ 4 và annotate
test
vớiJvmField
1 | class JvmFieldTest { |
- Khi bạn muốn sử dụng
test
trong Java classTest.java
:
1 | public class Test { |