在Scala中有伴侣对象的基本原理是什么?

有没有一个类的伴侣对象(单身人士)的情况下需要? 为什么我要创build一个类,说Foo并为它创build一个伴侣对象?

伴侣对象基本上提供了一个可以放置“静态”方法的地方。 此外,伴侣对象或伴侣模块可以完全访问类成员,包括私人类。

伴随对象非常适合封装诸如工厂方法的东西。 例如,无处不在,例如FooFooFactory ,您可以让一个伴随对象的类承担工厂职责。

伴随对象对于存储一个类的所有实例通用的状态和方法是有用的, 但是它们不使用静态方法或字段。 他们使用可以通过inheritance重写的常规虚拟方法。 斯卡拉真的没有什么静态的。 有很多方法可以使用,但这里有一个简单的例子。

 abstract class AnimalCounter { var animals = 0 def name: String def count() { animals += 1 println("%d %ss created so far".format(animals, name)) } } abstract class Animal { def companion: AnimalCounter companion.count() } object Dog extends AnimalCounter { val name = "dog" } class Dog extends Animal { def companion = Dog } object Cat extends AnimalCounter { val name = "cat" } class Cat extends Animal { def companion = Cat } 

哪个产生这个输出:

 scala> new Dog 1 dogs created so far scala> new Cat 1 cats created so far scala> new Dog 2 dogs created so far scala> new Cat 2 cats created so far 

…这是存放静态工厂方法(而不是DP)的好地方。 如果你命名那些重载的工厂方法适用(/ /),你将能够创build/初始化你的课程

  1. 没有“新”(不是那么重要)

  2. 与不同的可能的参数集(比较Bloch在有效Java中关于伸缩构造函数写的内容)

  3. 有能力决定你想创build哪个派生类,而不是抽象(伴随)类

示例代码:

 abstract class AbstractClass; class RealThing(s: String) extends AbstractClass; class AlternativeThing(i: Int) extends AbstractClass; object AbstractClass { def apply(s: String) = { new RealThing(s) } def apply(i: Int) = { new AlternativeThing(i) } } // somewhere else you can val vs = AbstractClass("asdf") // gives you the RealThing wrapped over string val vi = AbstractClass(123) // gives you AlternativeThing wrapped over int 

我不会调用对象/基类AbstractXxxxx,因为它看起来不好看:像创build抽象的东西。 给这些名字一个真正的意义。 考虑使用不可变的方法less的case类和封闭抽象基类。

除了Saem在回复中提到的事情之外,Scala编译器还会在对应的伴随对象(源代码或目标代码)中查找types的隐式转换 ,因此不需要导入转换。

关于一般单例对象的原因在Scala中编程说:

正如第1章所述,Scala比Java更面向对象的一种方式是Scala中的类不能有静态成员。 相反,斯卡拉有单身物件(第65页)。

我始终将伴侣对象视为一个桥梁 ,在Scala中编写面向函数和面向对象的代码。 很多时候我们只需要input一些纯函数,并提供处理结果。 将这些相关函数放在伴随对象中,可以轻松地查找和使用,为我自己以及代码顶部的一个build筑物。

而且,这是一种语言提供的特性,可以在不做任何事情的情况下编写单例模式。 当你需要一个单例来封装一个委托给JVM的时候,这是特别有用的。 例如,在Scala中编写一个简单的HTTP客户端库,您可以在其中封装基于Java实现的基础委托者,让API的消费者可以在纯粹的世界中生活。

如果你在同一个文件中定义了类和对象,它们被称为伴侣类和对象。 Scala没有静态的JAVA关键字,你可以把Scala中的伴侣类和对象作为静态replace。

有关更多详细信息,请查看scala编程中的文章类和对象关键字

首先,它提供了一个清晰的静态和非静态方法的分离方法。也提供了一个简单的方法来创build单例类。

它也可以inheritance其他类和/或特性的方法,这是Java静态方法无法做到的,可以作为parameter passing。