Kotlin主要是Java的直接替代品,但它摆脱了著名的Java结构:static
关键字。相反,该类级别的功能主要由伴随对象提供。
伴随对象提供更好替代方法的静态方法和字段有什么问题?我对基本原理感到困惑,并且在文档中找不到任何解释。
static
在Java中发现该关键字后,它就立即传播到程序的各个角落,因为还没有教过面向对象的程序设计。 。
Kotlin主要是Java的直接替代品,但它摆脱了著名的Java结构:static
关键字。相反,该类级别的功能主要由伴随对象提供。
伴随对象提供更好替代方法的静态方法和字段有什么问题?我对基本原理感到困惑,并且在文档中找不到任何解释。
static
在Java中发现该关键字后,它就立即传播到程序的各个角落,因为还没有教过面向对象的程序设计。 。
Answers:
Scala还用“ Singleton”对象替换了类级别的声明。这样做的主要优点是,一切都是对象。在Java中,静态成员与对象成员的区别非常大。这意味着您无法执行诸如实现接口或将类“实例”放入映射中或将其作为参数传递给采用Object的方法的操作。伴随对象允许这些事情。那是优势。
引用Kotlin 参考文档:
请注意,即使伴随对象的成员看起来像其他语言中的静态成员,在运行时它们仍然是真实对象的实例成员,并且可以实现接口。
对我来说,听起来很像Kotlin设计师将其视为Java静态成员的优势。
此外,有关Java互操作性和静态成员的部分说明了如何使用伴随对象来创建成员,当使用注释时,它们的行为类似于静态成员@JvmStatic
。
Kotlin是一种面向对象的语言。在面向对象的语言中,不是对象的东西是极其残酷的限制。类不是对象,但是对象是对象(duh!),所以问题应该是:为什么语言不使用伴侣对象?
另一个方面是简单性:为什么只有对象具有实例成员,为什么要有两件事,即具有实例成员的对象和具有静态成员的类?
许多Smalltalk派生语言中使用的替代方法是使类本身成为对象。例如,在Smalltalk类中,是元类的并行层次结构的实例。在Ruby中,类是类的实例Class
(是的,这意味着它Class
是其本身的实例)。在这种情况下,“类方法”实际上只是该类的元类的普通实例方法。我不知道为什么没有在Java中选择这种设计(鉴于它与Smalltalk的关系非常紧密),但它可能与简化类型系统有关(请注意,大多数将类作为对象的语言倾向于动态语言)。
MyStaticClass
一些static
成员,则可以引用MyStaticClass.class
以获取Class
该类的实例。然后,您可以使用反射来访问/调用您的static
成员。仍然确实没有将static
成员实际上附加到任何对象实例上(至少在概念上;不确定Java的实际作用是什么)。但这确实意味着,至少在接受的答案中提出的某些限制并不严格适用。