我bytes
在科特林上课了:
var bytes: ByteArray? = null
get() = when {
field != null -> Arrays.copyOf(field, field!!.size)
else -> field
}
set(value) {
field = when {
value != null -> Arrays.copyOf(value, value.size)
else -> null
}
}
为什么在第三行必须有一个!!
运算符field
?
没有!!
创意节目:
无法智能地将其强制转换为“ ByteArray”,因为“字段”是可变属性,而此时可能已更改
条件(field != null)
确保if主体(右侧)中的字段为null。或不?还是可以同时将其重新分配为null?这怎么可能?
使用上面的代码,FindBugs警告:
com.xy.Some.bytes的冗余nullcheck,在com.xy.Some.getBytes()中已知为null
此方法包含针对常量null的已知null值的冗余检查。
http://findbugs.sourceforge.net/bugDescriptions.html#RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE
bytes
是一个var
可变的,可以在进行空检查后更改(可能在其他线程上)。您不能保证bytes
它为非null,因此!!
在这里使用是不安全的。
官方说明:
请注意,当编译器不能保证变量不能在检查和用法之间更改时,智能强制转换将不起作用。更具体地说,根据以下规则适用智能强制类型转换:
- val局部变量-始终;
- val属性-如果属性是私有属性或内部属性,或者在声明该属性的模块中执行检查。智能强制转换不适用于开放式属性或具有自定义吸气剂的属性;
- var局部变量-如果在检查和使用之间未修改该变量,并且未在修改该变量的lambda中捕获该变量;
- var属性-永远不会(因为该变量可以随时通过其他代码进行修改)。
解决方法之一是使用let
:
get() = field?.let { Arrays.copyOf(it, it.size) } ?: field
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句