Kotlin密封类内object语法疑问:为何无需用=赋值?
为什么用冒号而不是等号定义Signup?
这是Kotlin里单例对象继承父类的语法规则,和你理解的“属性赋值”完全是两回事,拆解来看:
object Signup:这行是直接声明一个单例类的唯一实例,Signup不是普通属性,它本身就是一个类(同时是这个类的唯一实例),Kotlin的object关键字就是干这个的——不用写构造函数,直接生成全局唯一的实例。: DestinationScreen(route = "signup"):冒号在这里表示继承关系,说明这个Signup单例对象是DestinationScreen密封类的子类,同时调用父类的构造函数传入route参数。
如果写成object Signup = DestinationScreen(...)是完全错误的,因为object是用来定义单例类型的关键字,不是变量,不能用赋值符号=。要是你想定义一个普通属性来存父类实例,那应该写val Signup = DestinationScreen(route = "signup"),但这样的话Signup只是父类的一个实例,不是密封类的子类,也就没法利用密封类在编译时校验路由的优势了。
在Jetpack Navigation里用这种写法,就是为了让每个路由都是密封类的单例子类:既保证全局只有一个实例,又能让编译器帮你检查所有可能的路由分支,避免出错。
内容的提问来源于stack exchange,提问作者Shun Takahashi
相关产品推荐
相关产品推荐

