Dav*_*ter 2 java kotlin kotlin-null-safety nullsafe null-safety
我目前正在从 java 切换到 kotlin,不断出现的优点之一是 kotlin 是空安全的,默认情况下不能为变量或对象分配空值,但有一些方法可以分配空值。空值。但是我不确定为什么这有好处,Java 不安全会产生什么问题?
到目前为止,在线搜索仅给出了零安全是什么的描述,而不是为什么要实现零安全。提前致谢。
从根本上来说,这是一个打字问题。
你不妨问这个完全类似的问题:
“我目前正在从 javascript 切换到 java,不断出现的优点之一是 java 是类型化的,不能为变量或对象分配您不期望的值。但是我不确定为什么这有好处,Javascript 类型不安全会产生什么问题?”
假设我写了这个方法。足够简单:
public boolean areBanksOpen(LocalDate someDate) {
...
}
Run Code Online (Sandbox Code Playgroud)
此方法检查有关法定国家假日等的书籍。在您的脑海中,您应该创建这样一个概念:代码某些部分的作者与代码其他部分的作者不同。即使对于只有一个人参与的项目:那么就是你,三年前编写一些代码,而不是你今天使用该代码。当你当时编写代码时,你不记得(或者不应该记住)该代码的每个角落。
既然不是同一个人,沟通就非常重要。您需要从该方法的作者areBanksOpen到该方法的用户进行沟通:它叫什么,它有什么作用,如何使用它?是的,当然,您可以编写一个庞大的教程,但沟通比这要复杂一些;如果您 95% 的编程时间都花在阅读网络浏览器中的教程上,那就不好了。快速提醒以及编辑器环境中检测您所犯错误的“训练轮”都是值得拥有的好东西。
在java中,打字就是这样做的。在java中,你不能写areBanksOpen("10-12-2021"). 您的编辑器会立即告诉您这是行不通的,您必须指定一个LocalDate实例,而不是String. 在 javascript 中,除非运行它,否则你不知道。
无效性也是同样的道理。IDE 或仔细阅读 javadoc 的人无法确定该areBanksOpen方法是否接受 null。我可以打电话areBanksOpen(null)吗?返回类型相同:给定一个方法String getStudentName(StudentId studentId),null甚至可以返回吗?
从这个意义上说, java 中的所有类型That | Null都是真正的- 就像该getStudentName方法返回“字符串或 null”一样,这就是签名的含义,即使文档指出:如果studentId未找到,此方法将引发一些异常,并且所有学生都有一个 ID(因此意味着:不,此方法永远不会返回 null)。方法签名不传达该信息,只有文档传达该信息。完全类似于 javascript 中的方法:
/** Pass a date object, returns a boolean whether banks are open */
function areBanksOpen(date) { .. }
Run Code Online (Sandbox Code Playgroud)
在 javascript 中解释了它在文档中的工作原理,但签名本身不提供此信息,这意味着编辑者不能成为第二双眼睛,因为编辑者不阅读文档,但他们可以理解签名,并且[B] 您无法在自动完成框等中获得快速查找的好处。
这就是优势所在:在 kotlin 中,你确实知道,你的编辑器也知道
然而,那些告诉你这一点的人是错误的。Java 也有这个,它被称为无效注释。在java中你可以做类似的事情:
public boolean areBanksOpen(@NonNull LocalDate when) {}
Run Code Online (Sandbox Code Playgroud)
然后 IDE 将对任何调用尝试areBanksOpen(null)或areBanksOpen(someVar)简单的代码分析显示someVar可能包含null值的地方进行红线标记。这不是切换到 kotlin 的理由。
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |