这基本上是一个打字问题。
你不妨问这个完全类似的问题:
“我目前正在从 javascript 切换到 java 的过程中,不断出现的一个声明的优点是 java 是类型化的,不能为变量或对象分配一个你没有的值期待。但是我不确定为什么这是有益的,因为 Javascript 不是类型安全会出现什么问题?”
假设我写了这个方法。很简单:
public boolean areBanksOpen(LocalDate someDate) {
...
}
此方法检查有关法定节假日之类的书籍。在您的脑海中,您应该创建这样的概念,即代码的某些部分的作者与代码的其他部分的作者不同。即使对于只有一个人从事的项目:然后是您,三年前编写一些代码,而不是您今天使用该代码。你不记得(或者不应该记住)你当时写的代码的每一个角落。
鉴于不是同一个人,沟通非常重要。您需要从areBanksOpen 的作者与该方法的用户沟通:它叫什么,它做什么,你如何使用它?是的,你当然可以写一个巨大的教程,但沟通比这复杂一点;如果你 95% 的编程时间都花在了浏览器上阅读教程上,那就不好了。快速提醒,以及来自您的编辑器环境的“训练轮”,可以检测您所犯的错误。
在 java 中,打字就是这样做的。在java中,你不能写areBanksOpen("10-12-2021")。您的编辑器会立即告诉您这不起作用,您必须指定 LocalDate 实例,而不是 String。在 javascript 中,您只有在运行它时才会知道。
nullity 也是一样。 IDE 或阅读 javadoc 的人无法确定 areBanksOpen 方法是否接受 null。我可以打电话给areBanksOpen(null)吗?返回类型也一样:给定方法String getStudentName(StudentId studentId),是否可以返回null?
从这个意义上说,java 中的 所有类型 确实是 That | Null - 就像 getStudentName 方法返回“字符串或空值”一样,这就是签名的含义,甚至如果文档调用:如果找不到studentId,并且所有学生都有一个ID,则此方法会引发一些异常(因此暗示:不,此方法永远不会返回null)。 方法签名 不传达该信息,只有文档可以传达。完全类似于javascript中的方法:
/** Pass a date object, returns a boolean whether banks are open */
function areBanksOpen(date) { .. }
在 javascript 中解释了它在文档中的工作原理,但签名本身不提供此信息,这意味着 [A] 编辑器不能成为第二双眼睛,因为编辑器不阅读文档但他们可以理解签名,并且 [B] 您无法从自动完成框等中的快速查找中受益。
这就是的优势所在:在 kotlin 中你确实知道,你的编辑器也知道
但是,告诉你这件事的人是误会了。 Java也有这个,它被称为nullity annotations。在 java 中,你可以这样做:
public boolean areBanksOpen(@NonNull LocalDate when) {}
然后 IDE 将对调用 areBanksOpen(null) 或 areBanksOpen(someVar) 的任何尝试进行 insta-redline,其中简单的代码分析表明 someVar 可能包含 null 值。这不是切换到 kotlin 的理由。