2016-05-12 15 views
7

Tôi thường có điều này trong Java:const tĩnh trong Kotlin từ Java tên lớp

package some.package; 
public class Clz { 
    public static final String ACTION_DIVE = Clz.class.getName() + ".action.DIVE"; 
} 

có thể truy cập từ bên ngoài lớp học mà như Clz.ACTION_DIVE và giá trị sẽ "some.package.Clz.action.DIVE".

Làm cách nào tôi có thể thực hiện tương tự trong lớp Kotlin Clz để có thể truy cập nó theo cách tương tự từ các lớp Java bên ngoài? Tôi đã thử các sau đây nhưng nó không biên dịch vì nó không phải là một hằng số:

package some.package 
object Clz { 
    const val ACTION_DIVE = Clz.javaClass.name + ".action.DIVE" 
} 

Trả lời

7

Clz::class.java.name

Xem Class references trong tài liệu chính thức Kotlin.

+1

Không làm việc. 'const val ACTION_DIVE = Clz :: class.java.name +" .action.DIVE "' Lỗi là: 'Const val initializer phải là một giá trị không đổi' – yuku

+2

Sử dụng '@ JvmField' thay vì' const' ('const' chỉ dành cho các hằng số biên dịch): https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#static-fields –

+0

Tôi đoán là vậy. @JvmField. Cảm ơn! – yuku

3

Bạn có thể sử dụng:

object Clz { 
    val ACTION_DIVE = Clz::class.java.name + ".action.DIVE" 
} 

ý rằng kể từ khi nó đang gọi java sở hữu mở rộng các ACTION_DIVE có thể không const.

Nếu bạn thực sự cần một người const bạn có thể làmbạn có thể, trong phiên bản cũ của trình biên dịch Kotlin, làm:

object Clz { 
    const val ACTION_DIVE = "" + Clz::class + ".action.DIVE" 
} 
+0

Nó dường như không hoạt động với const: 'const val ACTION_DIVE =" "+ Clz :: class +" .action.DIVE "' –

+0

@StephaneL Tôi đoán nó được sử dụng để làm việc trong phiên bản cũ của trình biên dịch Kotlin. Nó có lẽ là một lỗi mặc dù. – miensol

2

Bạn có thể khai báo một companion object bên trong lớp học của bạn và đưa tài sản cố định bên trong .

class Clz { 

    companion object{ 
     var ACTION_DIVE = Clz::class.simpleName + ".action.DIVE" 
    } 
} 

Sau đó, bạn có thể truy cập vào các tài sản

println(Clz.ACTION_DIVE) 
+0

Một biến có thể thay đổi toàn cầu hiếm khi là một ý tưởng hay. Đó cũng không phải là ý định của tác giả. – miensol

0

Một cách thanh lịch để nối chuỗi:

package some.package 

object Clz { 
    val ACTION_DIVE = "${Clz::class.java.name}.action.DIVE" 
} 
+1

Điều này sẽ không biên dịch: "Const 'val' initializer phải là một giá trị không đổi" – miensol

+0

@miensol bạn là đúng, tôi chỉ cần loại bỏ 'const' modifier. – epool

0

làm việc cho tôi:

class FetchWeatherTask : AsyncTask<Void,Void,String>() { 
    companion object { 
     @JvmField val TAG: String = FetchWeatherTask().javaClass.simpleName 
    } 
} 
Các vấn đề liên quan