由于kotlin没有静态字段,我应该serialVersionUID
在伴随对象中定义吗?
要serialVersionUID
在Kotlin中创建一个类,您有一些选项,包括将一个成员添加到该类的伴随对象.
最简洁的字节码来自a private const val
将成为包含类的私有静态变量,在这种情况下MySpecialCase
:
class MySpecialCase : Serializable { companion object { private const val serialVersionUID: Long = 123 } }
您也可以使用这些表单,每个表单都具有getter/setter方法的副作用,这些方法不是序列化所必需的...
class MySpecialCase : Serializable { companion object { private val serialVersionUID: Long = 123 } }
这会创建静态字段,但也会getSerialVersionUID
在随播对象上创建一个不必要的getter .
class MySpecialCase : Serializable { companion object { @JvmStatic private val serialVersionUID: Long = 123 } }
这会创建静态字段,但也会getSerialVersionUID
在包含类上创建静态getter,MySpecialCase
这是不必要的.
但是所有工作都是将其添加serialVersionUID
到Serializable
类中的方法.
是的,您可以在伴随对象中声明它。医生说:
而且,在对象和伴随对象中定义的公共属性以及用const注释的顶级属性在Java中都变成了静态字段
但是私有财产似乎也是如此:
class MyException: Exception() { companion object { private val serialVersionUid: Long = 1 } }
javap -c -p com.ninja_squad.kotlindiscovery.MyException.class
Compiled from "MyException.kt" public final class com.ninja_squad.kotlindiscovery.MyException extends java.lang.Exception { private static final long serialVersionUid; public static final com.ninja_squad.kotlindiscovery.MyException$Companion Companion; static {}; Code: 0: getstatic #38 // Field com/ninja_squad/kotlindiscovery/MyException$Companion.INSTANCE:Lcom/ninja_squad/kotlindiscovery/MyException$Companion; 3: putstatic #40 // Field Companion:Lcom/ninja_squad/kotlindiscovery/MyException$Companion; 6: lconst_1 7: putstatic #21 // Field serialVersionUid:J 10: return public com.ninja_squad.kotlindiscovery.MyException(); Code: 0: aload_0 1: invokespecial #15 // Method java/lang/Exception."":()V 4: return public static final long access$getSerialVersionUid$cp(); Code: 0: getstatic #21 // Field serialVersionUid:J 3: lreturn }