首页 文章

了解scala中的伴随对象

提问于
浏览
0

在学习Scala时,我遇到了有趣的伴侣对象概念 . Companion对象可用于在Scala中定义静态方法 . 关于伴随对象,在下面的Spark Scala代码中需要做一些澄清 .

class BballStatCounter extends Serializable {
  val stats: StatCounter = new StatCounter()
  var missing: Long = 0

  def add(x: Double): BballStatCounter = {
    if (x.isNaN) {
      missing += 1
    } else {
      stats.merge(x)
    }
    this
  }
}
object BballStatCounter extends Serializable {
  def apply(x: Double) = new BballStatCounter().add(x)
}

使用 val stat3 = stats1.map(b=>BballStatCounter(b)) 调用上面的代码 .

  • 类中声明的变量 statsmissing 的性质是什么?它类似于Python的类属性吗?

  • apply 方法在这里有什么意义?

2 回答

  • 1

    这里 stats and missing 是类属性,BballStatCounter的每个实例都有自己的副本,就像在Python中一样 .

    在Scala中,方法 apply 用于特殊目的,如果任何对象具有方法apply,并且如果该对象用作函数调用符号(如Obj()),则编译器将其替换为其apply方法调用,如Obj.apply() .

    apply方法通常用作Class Companion对象中的构造函数 . Scala中的所有集合类都有一个带有apply方法的Companion对象,因此您可以创建一个列表,如:List(1,2,3,4)

    因此,在上面的代码中,BballStatCounter(b)将被编译为BballStatCounter.apply(b)

  • 0
    • statsmissing 是类 BcStatCounter 的成员 . statsval 所以一旦定义它就无法更改 . missingvar 所以它更像传统变量,可以更新,就像在 add 方法中一样 . BcStatCounter 的每个实例都将包含这些成员 . (与Python不同,您无法在Scala对象中添加或删除成员)

    • apply 方法是一种使对象看起来像函数的快捷方式 . 如果你有一个带有 apply 方法的对象 x ,你编写 x(...) ,编译器会自动将其转换为 x.apply(...) . 在这种情况下,这意味着您可以调用 BballStatCounter(1.0) ,这将调用 BballStatCounter 对象上的 apply 方法 .

    这些问题都不是关于伴随对象的,这只是普通的Scala类框架 .

    请注意有关提出多个问题的评论中的评论 .

相关问题