如何避免Kotlin字段中的冗余null检查(FindBugs警告)

卢卡斯M.

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

建议阅读:在Kotlin中,处理空值,引用或转换它们的惯用方式是什么

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何隐藏字段或局部变量的FindBugs警告

如何避免Java中的构造函数代码冗余?

克隆HashSet时如何避免未经检查的转换警告?

未经检查的投放警告-如何避免这种情况?

如果您使用旧版库,如何避免Java中未经检查的转换警告?

FindBugs-冗余比较为null

如何避免Spring Boot应用程序中的冗余流量?

如何使用jq从json中消除包含数据的冗余字段

如何使用Findbugs避免Kotlin文件

如何检查JSON中的字段是否为null?

如何避免NLog.Config中的冗余?

如何避免异步javascript中的冗余代码?

如何从代码编辑器中删除FindBugs检查

首先检查结果是否为null时,如何避免冗余方法调用?

如何合并结构中的冗余字段?

如何避免ASP.Net Core中的代码冗余?

如何避免JSON文件中的冗余?

如何避免构造函数中的冗余计算

当chainig在JavaScript中起作用时,如何避免冗余?

在Kotlin中继承时避免冗余代码

如何检查MS Word中特定字符串的冗余?

如何避免Nagios服务定义中的冗余?

如何避免AngularJS中的冗余变量

在使用@NotNull并在方法调用之前在另一个方法中检查null时,如何避免出现null警告?

如何避免或修复与 Int 与 Integer 相关的 Kotlin 警告

如何避免 JSONObject Null 检查

如何计算 Flutter/Dart 中的纵向冗余检查 (LRC)?

如何避免在函数中传递“冗余”参数?

如何避免在 TypeScript 中检查所有字段是否可为空?