`
squirel
  • 浏览: 22031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala Class主构造器参数行为详解

阅读更多
Scala Class主构造器的参数有3种类型,val、var和普通类型(没有val、var标识),其中标识为val、var的参数的行为中《Programming in Scala》中说明的很清楚,普通类型则语焉不详。最近在写的一个类时碰到一个情况,类主构造器参数中有一个大对象,但在主构造器中会把这个对象的数据进行处理,转换成另外一种形式,而传进来的原始数据则不在需要,所以希望能被尽快释放掉,这样就担心Scala会不会像处理val、var那样在类里保持一个对该原始对象的引用,为了验证就把class文件用javap打开来看了一下。

假设有如下的一个类定义:
class Test(nor: Int, pa: Int) {
   private val dpa = pa * 2

   def normal = nor
   def doublePa = dpa
}

类有两个构造参数,nor在类的方法中会被用到,所以可以肯定会在类中定义一个field,而pa只在主构造器中用到,在类的其它方法中都没有用到,所以没有必要像nor一样定义成一个field的,那Scala编译器是不是这样处理的呢,我们用javap打开编译后的class文件看一下:
public class Test implements scala.ScalaObject {
  private final int nor;
  private final int dpa

  private int dpa();
  public int normal();
  public int doublePa();

  public Test(int, int);
}


可以看到nor被转换成一个private final的变量nor,但并没有pa变量,而只有我们自己定义的*2之后的dpa变量及一个读取它的private int dpa()函数,可见,Scala已经做了优化,只在主构造器中使用,而在类定义中没有用到的构造参数会被优化掉。
分享到:
评论

相关推荐

    Scala程序设计(第2版)

    8.5 Scala的构造器 217 8.6 类的字段 221 8.6.1 统一访问原则 223 8.6.2 一元方法 224 8.7 验证输入 224 8.8 调用父类构造器(与良好的面向对象设计) 226 8.9 嵌套类型 230 8.10 本章回顾与...

    快学 scala 中文版 带完整目录

    5.7 主构造器 72 5.8 嵌套类 L175 练习 78 第6章 对象 A1 81 6.1 单例对象 81 6.2 伴生对象 82 6.3 扩展类或特质的对象 83 6.4 apply方法 84 6.5 应用程序对象 85 6.6 枚举 86 练习 87 第7章 包和引入 A1...

    case-app:Scala的类型级别和无缝命令行参数解析

    `case-app`会自动为这个case类生成解析器和帮助信息,我们只需要调用`MyTool.parse(args)`即可解析命令行参数。如果用户输入了不正确的参数,编译器会在编译时抛出错误,而不是等到运行时才暴露问题。 `case-app`还...

    Scala小程序详解及实例代码

    Scala中的`object`类似于Java中的`class`,但它可以包含静态成员和主构造器。`main`方法是每个Scala应用程序的起点,它的签名是`def main(args: Array[String])`。`args`参数数组包含了从命令行传递的参数。 5. **...

    design-patterns-scala:用Scala语言实现设计模式

    与Java不同,Scala的case class提供了更加优雅的构造器和类型安全的工厂方法。 3. **抽象工厂模式**:在Scala中,可以通过定义一个工厂接口,然后由不同的实现类提供具体的工厂方法来创建相关的产品对象,以此实现...

    柴油:Scala中无样板,零开销的无标签最终打字最终版无标签DSL

    - 无标签设计是无样板的一个变种,它进一步消除类型构造器(type constructor)的使用,即不再依赖于特定的表示类型。这样,DSL的实例可以在不牺牲性能的情况下进行互换,因为编译器会自动优化掉所有相关的类型转换...

    ScalaSpreadsheet:独立项目,用于我继续开发来自 Programming in Scala Second Edition 的 Scala 电子表格示例

    此外,项目可能采用了Scala的case class来表示行和列,因为它们提供了自动构造器、解构以及等于比较等功能,非常适合数据表示。同时,可能会使用映射(Map)或数组(Array)等内置集合来存储电子表格中的数据,以...

    shapeless_2.11-2.3.2.zip

    在Scala中,Shapeless还引入了Kind概念,允许开发者处理更高阶的类型,如类型构造器的类型构造器。这对于构建复杂的类型系统和表示多层嵌套的类型非常有用。 6. **Witnesses**: Shapeless中的Witness类是类型...

    数据类:具有更好二进制兼容性的案例类

    - **构造器简洁**:你可以通过逗号分隔的参数列表直接创建Case Class实例,无需显式的`new`关键字。 - **自动实现`equals()`和`hashCode()`**:Case Class的`equals()`方法基于其所有字段的值,而`hashCode()`方法...

    scala-form-with-enum:如何在模型类中创建具有枚举类型的表单的示例

    在Java中,枚举是一种特殊的类,而在Scala中,枚举更加灵活,可以包含字段、方法和构造器。创建枚举类型的基本语法如下: ```scala object Color extends Enumeration { type Color = Value val Red, Green, Blue...

    jsondsl:JSON DSL的无标签最终样式

    回到我们的主题“jsondsl”,它很可能是这样一个实现:提供了一个无标签最终样式的JSON DSL库,用户可以方便地在Scala代码中构造JSON,同时可以选择不同的后端(如字符串生成、文件写入等)来处理这些JSON对象。...

    笔记-JVM三期.pdf

    其中,加载阶段将类文件加载到内存,验证确保字节码的正确性,准备阶段为静态变量分配内存并初始化为默认值,解析阶段将符号引用转换为直接引用,初始化则是执行类构造器。 JRE(Java Runtime Environment)包含了...

    scalacheck-shapeless:使用scalacheck和shapeless生成任意案例类ADT实例

    Shapeless 提供了诸如类型级函数、类型类和高阶类型构造器等工具,使得在编译时处理类型变得更加灵活和强大。其中,Shapeless 最为人所知的一个特性是其能够动态生成实例的能力,尤其是对于案例类和 sealed trait 的...

    fp-resources:函数式编程的大量资源

    "free-monads" 是一种构造Monad的抽象方法,它们提供了一种方式来描述计算过程而不执行它,这对于构建解析器、模拟器或构建DSL(领域特定语言)特别有用。 总的来说,fp-resources 包含了从基础到进阶的函数式编程...

Global site tag (gtag.js) - Google Analytics