Mif*_*eet 11 scala conventions companion-object
Scala标准库中的许多类使用apply()其伴随对象作为工厂.链接这样的呼叫时,这通常很方便List(List(1)).另一方面,仍然可以使用new(new HashMap[Int, Int]())直接创建对象.
这是标准库.现在,在我自己的代码中,哪种方法更好用:伴侣工厂或创建对象new?
是否有关于何时创建伴随对象工厂以及何时使用new关键字的约定?
使用一个优于另一个有什么好处?
在大多数情况下,我使用伴随对象的apply方法,因为代码看起来不太混乱。但是,使用静态工厂至少有一个好处。考虑一下MyInt只包装一个的非想象类型Int:
class MyInt(val i: Int)
Run Code Online (Sandbox Code Playgroud)
我可以获得MyInt调用构造函数的实例,该实例将在每次调用构造函数时实例化一个新对象。如果我的程序严重依赖MyInt于此,则会导致创建许多实例。假设MyInt我使用的大多数是-1,0和1,由于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。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |