为什么 kotlin 放弃 "new" 关键字?
Why did kotlin drop the "new" keyword?
为什么 kotlin 删除了 new 关键字?
这使得更难看出函数调用和对象分配之间的区别。
Kotlin Coding Conventions 明确指出:
- use of camelCase for names (and avoid underscore in names)
- types start with upper case
- methods and properties start with lower case
如果您按照上面的步骤 将 constructor
视为可以调用的常规函数 即 val invoice = Invoice()
则 new
关键字变为 多余。
一旦您适应了惯例,就很清楚代码在做什么。
事实上,即使在 Java 代码中,您也会有许多 隐式 分配发生在 Collections.singleton(o)
or Guava's Lists.newArrayList()
这样的方法调用之下,所以我不认为您关于使用 new
关键字更好地分配可见性的论点是完全有效的。
(IMO) 这样做是因为函数和对象构造之间没有真正的区别,即没有什么可以阻止函数分配对象(他们经常这样做)。
工厂函数就是一个很好的例子。这些函数创建新对象,但它们绝不是 class 构造函数。
AFAIK,new
关键字是由于对 C\C++ 的负面体验而创建的,其中返回新对象的函数必须特别标记(按名称约定),以免忘记(手动)释放内存。在像 Java\Kotlin 这样的 auto-memory-managing 语言中,这不是问题。
其他几种语言没有 new
关键字(Python、Scala,也许是 Ceylon),切换到这些语言的人似乎永远不会错过它。我知道我不知道。
为什么 kotlin 删除了 new 关键字? 这使得更难看出函数调用和对象分配之间的区别。
Kotlin Coding Conventions 明确指出:
- use of camelCase for names (and avoid underscore in names)
- types start with upper case
- methods and properties start with lower case
如果您按照上面的步骤 将 constructor
视为可以调用的常规函数 即 val invoice = Invoice()
则 new
关键字变为 多余。
一旦您适应了惯例,就很清楚代码在做什么。
事实上,即使在 Java 代码中,您也会有许多 隐式 分配发生在 Collections.singleton(o)
or Guava's Lists.newArrayList()
这样的方法调用之下,所以我不认为您关于使用 new
关键字更好地分配可见性的论点是完全有效的。
(IMO) 这样做是因为函数和对象构造之间没有真正的区别,即没有什么可以阻止函数分配对象(他们经常这样做)。
工厂函数就是一个很好的例子。这些函数创建新对象,但它们绝不是 class 构造函数。
AFAIK,new
关键字是由于对 C\C++ 的负面体验而创建的,其中返回新对象的函数必须特别标记(按名称约定),以免忘记(手动)释放内存。在像 Java\Kotlin 这样的 auto-memory-managing 语言中,这不是问题。
其他几种语言没有 new
关键字(Python、Scala,也许是 Ceylon),切换到这些语言的人似乎永远不会错过它。我知道我不知道。