Scala标准库:"显式实例化以减少子类中的类文件大小"

blu*_*e10 1 abstract-class scala standard-library traits

在Scala标准库中,出现了几种模式"显式实例化以减少子类中的类文件大小".例如,在Iterator.scala中:

/** Explicit instantiation of the `Iterator` trait to reduce class file size in subclasses. */
private[scala] abstract class AbstractIterator[+A] extends Iterator[A]
Run Code Online (Sandbox Code Playgroud)

在整个源文件中,抽象类用于构造匿名类而不是特征本身.很明显,评论已经给出了足够的动力,为什么要这样做.但是对我来说非常重要:为什么这个技巧会减小文件大小,为什么子类的大小会受影响而不是Iterator本身?

dre*_*xin 6

当您从特征中混合或创建匿名类时,对于特征中的所有具体方法,将调用转发到具体实现的存根方法放入类文件中.这将在每个班级一遍又一遍地完成.如果您改为创建一个抽象超类,则只会将方法放在那里.

编辑:根据RégisJean-Gilles评论改变帖子.

  • 区别是"阶级与特质"而不是"匿名与否".混合特征会导致字节码损失(因为存根),扩展类不会(因为这是标准的JVM模型,只是扩展类使得继承的方法可以立即访问).因此`Iterator`**的子类会产生这种惩罚,但是`AbstractIterator`的子类没有(惩罚已经由'AbstractIterator`支付*). (4认同)
  • 轻微校正:每次混合特征时都不会复制方法体.但是,对于特征的每个方法,您将获得一个相应的存根方法,该方法可以转发到实际的实现,而这些存根可以占用很大的空间(就字节码而言) (2认同)