[英]Do @NotNull annotations on getters have signifcant impacts on performance?
随机示例:在我的一个程序的源代码中,我有这个方法:
public @NotNull Currency[] getCurrencies() {
return this.currencies.values().toArray(new Currency[0]);
}
在编译之后,我的 IDE (Intellij) 将其转换为以下内容:
@NotNull
public Currency[] getCurrencies() {
Currency[] var10000 = (Currency[])this.currencies.values().toArray(new Currency[0]);
if (var10000 == null) {
$$$reportNull$$$0(4);
}
return var10000;
}
this.currencies
引用private final ConcurrentHashMap<String, Currency> currencies = new ConcurrentHashMap();
- 这意味着只有通过反射或宇宙射线导致位翻转,方法getCurrencies()
才能返回null
。
null
的情况下 - 放弃使用@NotNull
注释?谢谢
/编辑:我正在使用注释 package org.jetbrains.annotations
对你的吸气剂进行null
检查有点奇怪。 在您调用 getter 时,您的 object 已经在 state 中,它不应该在其中。您可能希望在 setter 或构造函数的参数上使用@NotNull
。
您可以做的是为您的getCurrencies
编写一个 JavaDoc。
/**
/* @return An array of currencies. Never null.
*/
public Currency[] getCurrencies() {}
但是记录一个方法不返回null
是非常罕见的。 不返回null
应该是黄金标准,如果一个方法可以返回null
它应该被记录,而不是相反。 此外,我不希望返回一组数据(数组、列表等)的 getter 返回null
。 而是返回一个空的 object。
@NotNull
不是编译器的注释。 编译器可能会使用这个注解并做一些额外的检查。 但是@NotNull
是供人类阅读编译器检查的代码的注释。 在 Java 的许多问题中,迄今为止最大的问题是未经检查的null
值随处可见。 在其他静态类型语言中,程序中任何地方的任何变量都可能根本不存在,并且违反了类型检查器可以提供的所有保证。
Kotlin 具有适当的可空类型。 Scala 的最新版本具有(选择加入)可为空的类型。 甚至 C# 的新版本也具有可为空的类型。 在 Java 中,@ @NotNull
应该被视为函数合约的一部分,几乎是其类型的一部分。 你不是说“嘿,编译器,检查这是否是null
”。 你说“我保证这个 function 永远不会返回null
”并且编译器正在检查它,就像声明返回类型String
保证你返回一个String
一样。 删除@NotNull
注释,因为您确定它是正确的,这无异于将所有返回类型更改为Object
,因为您知道函数返回的类型。 如果你认为
String getName(String prefix) { ... }
看起来比
Object getName(Object prefix) { ... }
那么你应该认为
@NotNull String getName(@NotNull String prefix) { ... }
看起来更好。 是更有力的保证。
根据需要使用@Nullable
和@NotNull
; 这些注释仅用于改进 Kotlin 互操作性,但在 Java 中没有实际用途(至少我不知道)。 编译后它们什么都没有留下,因此相信这会影响性能是值得怀疑的。 当问这些基本的事情,但又关心性能时,这可能会建议重新考虑优先级。 Function > 性能;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.