了解Scala中的伴随对象

时间:2018-09-07 01:32:56

标签: scala oop

在学习Scala时,我遇到了有趣的伴侣对象概念。伴侣对象可用于在Scala中定义静态方法。在以下Spark Scala代码中,关于伴随对象的说明很少。

SET @holder = (SELECT clndr_data FROM [x].[dbo].[CALENDAR] WHERE clndr_id = '954')

以上代码是使用 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) } 调用的。

  1. 在声明中声明的变量val stat3 = stats1.map(b=>BballStatCounter(b))stats的本质是什么 类?它类似于Python的类属性吗?
  2. 这里的missing方法的意义是什么?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

  1. statsmissing是类BcStatCounter的成员。 statsval,因此一旦定义就无法更改。 missingvar,因此它更像是传统变量,可以像add方法中那样进行更新。 BcStatCounter的每个实例都将具有这些成员。 (与Python不同,您无法从Scala对象添加或删除成员)

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

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

请注意评论中关于询问多个问题的评论。