ภาพรวม
Java ใช้คีย์เวิร์ด static สำหรับสมาชิกที่เป็นของ Class ไม่ใช่ Instance Kotlin ไม่มีคีย์เวิร์ด static แต่มีกลไกที่ทรงพลังกว่า: Companion Object และ Object Declaration พร้อม @JvmStatic
Java Static Example
public class Test {
static int myStaticVariable = 10;
static void staticMethod() {
System.out.println("www.tutorialspoint.com");
}
public static void main(String[] args) {
staticMethod(); // เรียกโดยไม่ต้อง new Test()
System.out.println(myStaticVariable);
}
}
วิธีที่ 1: Companion Object (แนะนำสำหรับ Kotlin)
class MyClass {
companion object {
// Property - ใช้ val (immutable) เป็นค่าเริ่มต้น
val staticField = "This is a Static Variable."
// Function
fun getStaticFunction(): String = "This is a static Method."
// ถ้าต้องการ Mutable (เหมือน static variable ใน Java)
var mutableStatic = 10
@JvmStatic set // สร้าง static setter สำหรับ Java
}
}
// เรียกใช้ใน Kotlin
fun main() {
println(MyClass.staticField)
println(MyClass.getStaticFunction())
MyClass.mutableStatic = 20 // ใช้งานเหมือน static variable
}
คุณสมบัติ Companion Object
- เข้าถึง Private Member ของ Class ได้
- Initialize พร้อมกับ Class Loading (เหมือน static initializer)
- Implement Interface ได้
- Extension Function/Property ได้
วิธีที่ 2: Object Declaration + @JvmStatic (สำหรับ Java Interop)
object MyClass {
@JvmStatic
val staticField = "This is a Static Variable."
@JvmStatic
fun getStaticFunction(): String = "This is a Static Method."
// ไม่มี @JvmStatic -> เรียกจาก Java ผ่าน MyClass.INSTANCE.getStaticFunction()
fun kotlinOnly() = "Kotlin only"
}
เมื่อไหร่ควรใช้ @JvmStatic
- ต้องการเรียกจาก Java Code แบบ
MyClass.staticMethod() - Library ที่จะให้ Java ใช้งาน
- Constant ที่ Java ต้องเข้าถึงเป็น Field (ไม่ใช่ Getter)
วิธีที่ 3: Top-level Declaration (Kotlin Idiomatic)
// ไฟล์ Constants.kt
const val APP_VERSION = "1.0.0"
const val MAX_COUNT = 100
fun formatMessage(msg: String) = "[LOG] $msg"
// ใช้งานใน Kotlin อื่นๆ โดยตรง (ไม่ต้อง prefix Class name)
fun main() {
println(APP_VERSION)
println(formatMessage("Hello"))
}
นี่คือวิธี "Kotlin Way" ที่สุด - ไม่ต้องผูกมัดกับ Class
ตารางเปรียบเทียบ
| วิธี | Kotlin Usage | Java Usage | Use Case |
|---|---|---|---|
| Companion Object | MyClass.foo() | MyClass.foo() (ต้อง @JvmStatic) | Factory, Constant, Utility ที่เกี่ยวกับ Class |
| Object + @JvmStatic | MyClass.foo() | MyClass.foo() | Java Interop สำคัญ |
| Top-level Function/Const | foo() | FileNameKt.foo() | Utility แบบอิสระ, Constants (Best Practice) |
| @JvmField | MyClass.FIELD | MyClass.FIELD (Field ตรงๆ) | Constant Primitive/String ให้ Java เข้าถึงเป็น Field |
ตัวอย่าง @JvmField สำหรับ Constant Field
class Constants {
companion object {
@JvmField
val MAX_SIZE = 100 // Java เข้าถึงได้: Constants.MAX_SIZE (ไม่ใช่ getMAX_SIZE())
}
}
สรุป
- Kotlin ไม่มี
static→ ใช้ Companion Object แทน - ใช้ Top-level const/function สำหรับ Utility/Constants ทั่วไป (Recommended)
- ใช้ @JvmStatic / @JvmField ก็ต่อเมื่อต้องเรียกจาก Java Code โดยตรง
- Companion Object สามารถ Implement Interface และ Extension ได้ - ทรงพลังกว่า Java Static