为什么单例对象更面向对象?

Saw*_*yer 35 scala

Scala编程:综合循序渐进指南中,作者说:

Scala比Java更面向对象的一种方式是Scala中的类不能有静态成员.相反,Scala具有单例对象.

为什么单例对象更面向对象?不使用静态成员有什么好处,而是使用单例对象?

Kev*_*ght 58

试图"大局"; 大部分内容已经在其他答案中得到了解释,但似乎没有一个全面的回复将所有内容放在一起并加入点.所以这里......

类上的静态方法不是对象上的方法,这意味着:

  1. 静态成员不能从父类/特征继承
  2. 静态成员不能用于实现接口
  3. 类的静态成员不能作为参数传递给某个函数

    (并且由于以上几点......)

  4. 静态成员不能被覆盖
  5. 静态成员不能是多态的

对象的重点在于它们可以从父对象继承,实现接口,并作为参数传递 - 静态成员没有这些属性,因此它们不是真正面向对象的,它们只不过是命名空间.

另一方面,Singleton对象是对象社区的完全成员.


单例的另一个非常有用的特性是,它们可以在稍后的某个时间点轻松更改为不是单例,如果从静态方法开始,这是一个特别痛苦的重构.

想象一下,你设计了一个程序来打印地址并通过某些类的静态方法表示与打印机的交互,然后你想要能够添加第二台打印机并允许用户选择他们将使用哪一个...它会这是一次有趣的体验!


小智 12

Singleton对象的行为类似于它们可以扩展/实现其他类型.

不能做到这一点在Java中只有静态类-这是相当糖Java的单例模式getInstance允许(至少)更好的命名空间/稳定标识和隐藏的区别.

  • 鉴于问题被标记为"Scala",Scala单例实现`getInstance`静态方法实际上并不正确(也不是,Scala没有静态方法......).虽然Java中的等效逻辑通常会选择此方法名称. (3认同)

Jör*_*tag 10

提示:它被称为面向对象的编程.

认真.

也许我遗漏了一些根本重要的东西,但我看不出大惊小怪:对象比非对象更面向对象,因为它们是对象.这真的需要解释吗?

注意:虽然听起来确实如此,但我真的不想在这里沾沾自喜.我查看了所有其他答案,我发现它们非常令人困惑.对我来说,显而易见的是,对象和方法比命名空间和过程更加面向对象(这是静态"方法"实际上是什么)的"面向对象"的定义.

拥有单例对象的另一种方法是使类本身成为对象,例如Ruby,Python,Smalltalk,Newspeak.