与静态方法相比,Scala的伴随对象有哪些优势?


50

Scala没有静态 -keyword,但是通过随播对象具有类似的功能。在幕后,伴随对象被编译为具有静态方法的类,因此所有这些都是语法糖。这种设计选择的优点是什么?劣势?其他的languanges有类似的构造吗?


Answers:


49

以下是一些原因,根据您自己的喜好,这些原因可能会或多或少吸引您:

  1. 不要仅仅因为它是“语法糖”而对其打折。虽然您可能说某些东西只是语法糖,但毕竟糖才是使您的生活更美好的-无论是程序员还是咖啡或茶饮者。

  2. 单身人士-每个Scala object本质上都是一个单身人士。考虑到在Java世界中,人们正在以各种不同的方式来实现单例,并且往往在实现时会犯一些错误,因此您不能像Scala那样简单地犯错误。写作object而不是class单身,您就完成了。

  3. 访问静态方法:Java中的静态方法可以从对象访问。例如,假设您有一个C带有静态方法的类f和一个ctype 对象C。然后应该调用C.f,但是Java允许您使用(尽管有警告)使用c.f,当您来自Scala后台时,它实际上没有任何意义,因为对象f实际上没有方法。

  4. 清晰的分隔:在Java中,您可以在类中混合使用静态和非静态属性以及方法。如果您有纪律性地工作,这不会成为问题,但是,如果您(或与此有关的其他人)没有问题,那么最终会遇到静态和非静态部分交错的情况,很难一目了然什么是静态的,什么不是静态的。在Scala中,伴随对象内部的所有内容显然都不是相应类的运行时对象的一部分,但是可以从静态上下文中获得。反之亦然,如果是在类中编写的,则该类的实例可以使用它,但不能从静态上下文中使用它。一旦开始向类中添加静态和非静态初始化程序块,这在Java中尤其麻烦。就动态执行顺序而言,这可能最终很难理解。

  5. 更少的代码:无需在中的每个属性或方法中添加static一词object,从而使代码更简洁(实际上,并不是真正的突出优势)。

缺点很难找到。有人可能会争辩说,静态部分和非静态部分应该属于同一部分,但是被Scala伴随对象的概念分开。例如,拥有一个类图可能看起来很奇怪,但是最终不得不在代码中创建两件事,并剖析哪个属性到达何处。


1
我还读到,静态不属于纯OOP软件。就像,当您需要静态行为时,请使用自己的类并创建该类的一个(单个)对象,该对象管理另一类对象的(潜在)静态行为。
K。。

1
“写对象而不是类使它成为单例,您就完成了。” 我本人并不太在意Singletons,但是我必须承认这种特殊的“语法糖”的直接性具有一定的魅力。
Ed Hastings

3
从1到5的所有点(甚至所有这些点)都不需要在运行时实现真正的伴侣对象。所有这些都可以轻松地制成纯语法糖,对运行时的影响为零。Alexey Romanov的答案给出了拥有运行时伴侣对象的唯一真正原因。
mas.morozov '16

“缺点很难找到。” 性能?ifnonnull与simple相比,访问对象方法会生成etc字节码invokeStatic
Eduardo Pareja Tobes

33

object与静态方法不同,另一个好处是s可以实现接口/特性。


8
我认为这是同伴对象与具有静态方法的类之间主要区别。伴随对象是多态的,可以作为参数传递给需要接口/特征的方法。
dcastro

4

伴侣对象是首先搜索隐式对象的对象,此后,scala会查看Predef,然后在该特定源文件中的显式“ import”语句中。

我还不够了解Java开发人员是否知道Java语言或库是否提供任何可比较的机制。

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.