何时使用伴侣对象工厂与新关键字

Mif*_*eet 11 scala conventions companion-object

Scala标准库中的许多类使用apply()其伴随对象作为工厂.链接这样的呼叫时,这通常很方便List(List(1)).另一方面,仍然可以使用new(new HashMap[Int, Int]())直接创建对象.

这是标准库.现在,在我自己的代码中,哪种方法更好用:伴侣工厂或创建对象new

是否有关于何时创建伴随对象工厂以及何时使用new关键字的约定?

使用一个优于另一个有什么好处?

Kul*_*mpa 5

在大多数情况下,我使用伴随对象的apply方法,因为代码看起来不太混乱。但是,使用静态工厂至少有一个好处。考虑一下MyInt只包装一个的非想象类型Int

class MyInt(val i: Int) 
Run Code Online (Sandbox Code Playgroud)

我可以获得MyInt调用构造函数的实例,该实例将在每次调用构造函数时实例化一个新对象。如果我的程序严重依赖MyInt于此,则会导致创建许多实例。假设MyInt我使用的大多数是-101,由于MyInt是不可变的,因此我可以重用相同的实例:

class MyInt(val i: Int) 

object MyInt {
  val one = new MyInt(1)
  val zero = new MyInt(0)
  val minusOne = new MyInt(-1)

  def apply(i: Int) = i match {
    case -1 => minusOne
    case 0 => zero
    case 1 => one
    case _ => new MyInt(i)
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,至少对于不可变的值,使用静态工厂而不是调用构造函数可能具有技术优势。这意味着,如果要在代码中表示已创建新实例,请使用new关键字。就个人而言,虽然我不知道是否有正式的约定,但我new在创建对象时使用-keyword,apply在创建值时使用-method。