【发布时间】:2018-07-12 09:07:23
【问题描述】:
我是属性新手,从 java 搬到了 kotlin。我在属性方面苦苦挣扎,我学到了很多但是初始化属性让我感到困惑,什么时候应该初始化或者什么时候它可以在没有初始化的情况下工作。
让我通过代码的帮助来解释它。下面是生成后端字段时需要初始化属性的代码,在发布代码之前让我发布kotlin official website中的段落。
如果属性使用 至少一个访问器的默认实现,或者如果 自定义访问器通过字段标识符引用它。
现在是下面的代码。
class Employee{
var data: String // because there are default implementation of get set
// so there will be a back-end field.
}
所以我必须初始化它否则编译错误。
好的,我可以理解为有人可以访问它,因此不会有任何值会产生错误的结果。
然后我继续下一步以进一步了解它,因此我添加了自定义 getter。
class Employee{
var data: String
get() = "default value"
}
这也会生成后端字段,因此编译错误以对其进行初始化。我可以理解为没有初始化值,所以编译器会抱怨它。
可能是编译器不够聪明 yet 无法检查自定义 getter 是否存在为该属性提供结果的值,因此不要抱怨初始化只是返回该值需要时。
但是如果有人访问它应该没有问题,那么默认值已经存在,那么为什么编译器仍然会抱怨?
然后我再进一步实现自定义设置器。
class Employee{
var data: String
get() = "default value"
set(value){
field = value
}
}
仍然存在后端字段,因为我们已经访问了field,因此编译器会生成后端字段。
同样的错误,应该初始化。
然后是它工作正常的最后阶段,如下所示。
class Employee{
var data: String
get() = "default value"
set(value){
}
}
现在我没有在自定义gettersetter 中访问field,因此没有后端字段。而且效果很好。
那么最后一个问题是什么时候应该初始化属性?什么时候生成后端字段?
【问题讨论】:
-
你应该试试数据类,它和java bean类一样。所以你不需要创建 getter、setter 和所有。
-
@VijayMakwana 我不是在问解决方案,只是在问原因。
标签: kotlin