Tương đương với các trường cuối cùng tĩnh Java trong Kotlin là gì?


132

Trong Java, để khai báo một hằng, bạn làm một cái gì đó như:

class Hello {
    public static final int MAX_LEN = 20;
}

Tương đương trong Kotlin là gì?


1
val trong Kotlin có nghĩa là chỉ đọc, nên nó không đủ?
IgorGanapolsky

Câu trả lời:


212

Theo tài liệu của Kotlin, điều này là tương đương:

class Hello {
    companion object {
        const val MAX_LEN = 20
    }
}

Sử dụng:

fun main(srgs: Array<String>) {
    println(Hello.MAX_LEN)
}

Ngoài ra đây là thuộc tính tĩnh cuối cùng (trường có getter):

class Hello {
    companion object {
        @JvmStatic val MAX_LEN = 20
    }
}

Và cuối cùng đây là trường cuối cùng tĩnh:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}

Ví dụ đầu tiên (với trường const) có thể được sử dụng cho các thuộc tính. Trường hợp phổ biến: khai báo tất cả các đường dẫn api web trong một tệp và tham chiếu nó từ các bộ điều khiển với mã đó: "@RequestMapping (path = ArrayOf (WebPathConstants.MapApiPath))" (Thuộc tính khởi động mùa xuân)
Manushin Igor

Chào các cậu! Bạn có biết nếu @JvmField này vẫn cần thiết không? Tôi đang sử dụng điều này trong Android và nó cho thấy một cảnh báo lint nói rằng "const" có thể được sử dụng thay thế. Tôi đã thay đổi nó thành const và lớp java đang sử dụng nó không có vấn đề gì.
Leandro Ocampo

1
@LeandroOcampo vẫn cần thiết trong trường hợp nếu bạn có trường tĩnh có thể thay đổi, const val- biên dịch hằng số thời gian và chắc chắn nó có thể được sử dụng để thay thế @JvmField valtrong một số trường hợp. Thông qua nó không hoạt động nếu giá trị - được tính trong thời gian chạy, hoặc nó không phải là kiểu nguyên thủy hoặc Chuỗi. Tham chiếu: kotlinlang.org/docs/reference/ Kẻ
Ruslan

36

nếu bạn có một triển khai trong Hello, sử dụng companion objectbên trong một lớp

class Hello {
  companion object {
    val MAX_LEN = 1 + 1
  }

}

nếu Hellolà một đối tượng đơn thuần

object Hello {
  val MAX_LEN = 1 + 1
}

nếu các thuộc tính là hằng số thời gian biên dịch, hãy thêm một consttừ khóa

object Hello {
  const val MAX_LEN = 20
}

nếu bạn muốn sử dụng nó trong Java, hãy thêm @JvmStaticchú thích

object Hello {
  @JvmStatic val MAX_LEN = 20
}

1
câu trả lời hay nhất
RCorbellini 19/03/18

9

Cho tôi

object Hello {
   const val MAX_LEN = 20
}

là để nồi hơi nhiều. Tôi đơn giản đặt các trường cuối cùng tĩnh bên trên lớp của tôi như thế này

val MIN_LENGTH = 10

class MyService{
}

2
Trong trường hợp bạn không cần phải liên tục hiển thị bên ngoài tệp (ví dụ: java private), định nghĩa này là ngắn gọn nhất.
javaxian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.