为什么Kotlin中没有static关键字?


29

Kotlin主要是Java的直接替代品,但它摆脱了著名的Java结构:static关键字。相反,该类级别的功能主要由伴随对象提供。

伴随对象提供更好替代方法的静态方法和字段有什么问题?我对基本原理感到困惑,并且在文档中找不到任何解释。


4
只是冒充在scala中编程的人:伴随对象将静态和非静态方法的代码分开,它们可以在静态上下文中扩展其他类或接口,并且您可以在变量中引用伴随对象。不确定如何映射到科特林
凤凰城

与伴侣对象相比,静态方法和其他方法没有明显优势吗?
Tanner Swett

这不是原因,更多的是观察,但是我已经看到,(绝对的)初学者程序员static在Java中发现该关键字后,它就立即传播到程序的各个角落,因为还没有教过面向对象的程序设计。 。
Score_Un17年

Answers:


30

Scala还用“ Singleton”对象替换了类级别的声明。这样做的主要优点是,一切都是对象。在Java中,静态成员与对象成员的区别非常大。这意味着您无法执行诸如实现接口或将类“实例”放入映射中或将其作为参数传递给采用Object的方法的操作。伴随对象允许这些事情。那是优势。


2
那是个很好的观点。我一直认为奇怪的是,单例和静态具有非常相似的行为,但是除了伴随对象之外,什么也没有,消除了概念上的怪异。
user1446

1
这就是为什么在Java中,我更喜欢在静态构造的无状态对象上定义方法,而不是定义静态方法。
candied_orange

13

引用Kotlin 参考文档

请注意,即使伴随对象的成员看起来像其他语言中的静态成员,在运行时它们仍然是真实对象的实例成员,并且可以实现接口。

对我来说,听起来很像Kotlin设计师将其视为Java静态成员的优势。

此外,有关Java互操作性和静态成员的部分说明了如何使用伴随对象来创建成员,当使用注释时,它们的行为类似于静态成员@JvmStatic


6

Kotlin是一种面向对象的语言。在面向对象的语言中,不是对象的东西是极其残酷的限制。类不是对象,但是对象是对象(duh!),所以问题应该是:为什么语言使用伴侣对象?

另一个方面是简单性:为什么只有对象具有实例成员,为什么要有两件事,即具有实例成员的对象和具有静态成员的类?

许多Smalltalk派生语言中使用的替代方法是使类本身成为对象。例如,在Smalltalk类中,是元类的并行层次结构的实例。在Ruby中,类是类的实例Class(是的,这意味着它Class是其本身的实例)。在这种情况下,“类方法”实际上只是该类的元类的普通实例方法。我不知道为什么没有在Java中选择这种设计(鉴于它与Smalltalk的关系非常紧密),但它可能与简化类型系统有关(请注意,大多数将类作为对象的语言倾向于动态语言)。


1
“另一方面是简单性:为什么只有对象实例对象才有两个对象,即具有实例成员的对象和具有静态成员的类?”:重点是,尽管并非所有语言/语言设计人员都致力于简约。有些人认为为特殊情况或习语使用临时结构是一种优势。
Giorgio

1
我认为Java 确实(某种程度上)实现了这种模式至少是有争议的。例如,如果您有MyStaticClass一些static成员,则可以引用MyStaticClass.class以获取Class该类的实例。然后,您可以使用反射来访问/调用您的static成员。仍然确实没有将static成员实际上附加到任何对象实例上(至少在概念上;不确定Java的实际作用是什么)。但这确实意味着,至少在接受的答案中提出的某些限制并不严格适用。
aroth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.