Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

คีย์เวิร์ด static ใน Java เทียบเท่าใน Kotlin คืออะไร

ภาพรวม

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 UsageJava UsageUse Case
Companion ObjectMyClass.foo()MyClass.foo() (ต้อง @JvmStatic)Factory, Constant, Utility ที่เกี่ยวกับ Class
Object + @JvmStaticMyClass.foo()MyClass.foo()Java Interop สำคัญ
Top-level Function/Constfoo()FileNameKt.foo()Utility แบบอิสระ, Constants (Best Practice)
@JvmFieldMyClass.FIELDMyClass.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