Answers:
以下是一些原因,根据您自己的喜好,这些原因可能会或多或少吸引您:
不要仅仅因为它是“语法糖”而对其打折。虽然您可能说某些东西只是语法糖,但毕竟糖才是使您的生活更美好的-无论是程序员还是咖啡或茶饮者。
单身人士-每个Scala object
本质上都是一个单身人士。考虑到在Java世界中,人们正在以各种不同的方式来实现单例,并且往往在实现时会犯一些错误,因此您不能像Scala那样简单地犯错误。写作object
而不是class
单身,您就完成了。
访问静态方法:Java中的静态方法可以从对象访问。例如,假设您有一个C
带有静态方法的类f
和一个c
type 对象C
。然后应该调用C.f
,但是Java允许您使用(尽管有警告)使用c.f
,当您来自Scala后台时,它实际上没有任何意义,因为对象f
实际上没有方法。
清晰的分隔:在Java中,您可以在类中混合使用静态和非静态属性以及方法。如果您有纪律性地工作,这不会成为问题,但是,如果您(或与此有关的其他人)没有问题,那么最终会遇到静态和非静态部分交错的情况,很难一目了然什么是静态的,什么不是静态的。在Scala中,伴随对象内部的所有内容显然都不是相应类的运行时对象的一部分,但是可以从静态上下文中获得。反之亦然,如果是在类中编写的,则该类的实例可以使用它,但不能从静态上下文中使用它。一旦开始向类中添加静态和非静态初始化程序块,这在Java中尤其麻烦。就动态执行顺序而言,这可能最终很难理解。
更少的代码:无需在中的每个属性或方法中添加static一词object
,从而使代码更简洁(实际上,并不是真正的突出优势)。
缺点很难找到。有人可能会争辩说,静态部分和非静态部分应该属于同一部分,但是被Scala伴随对象的概念分开。例如,拥有一个类图可能看起来很奇怪,但是最终不得不在代码中创建两件事,并剖析哪个属性到达何处。
ifnonnull
与simple相比,访问对象方法会生成etc字节码invokeStatic
。