`
squirel
  • 浏览: 22327 次
  • 性别: 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实操教程及演示

    - Scala中的`class`类支持参数传递,默认构造器可用于初始化成员变量;如果需要重写构造器,则必须先调用默认构造器。 通过上述知识点的学习和实践,开发者可以更好地理解和掌握Scala的基础语法及其高级特性,从而...

    scala编程基础

    - **构造器**:Scala支持主构造器和辅助构造器。主构造器定义在类名之后,辅助构造器用于定义多个构造逻辑。 - **对象**:Scala中的对象用于实现单例模式。可以使用`object`关键字定义。 - **伴生对象**:与类名称...

    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编程详解 第13讲-Scala编程详解:面向对象编程之对象 共9页.pptx

    `object`可以继承抽象类并实现其方法,就像普通类一样,但它们不能有参数化的构造器。例如: ```scala abstract class Hello(var message: String) { def sayHello(name: String): Unit } object HelloImpl ...

    Scala设计模式

    - **类似于构造器调用:** 通过`apply`方法调用的方式,类似于构造器调用,易于理解。 **劣势:** - **仅限于静态工厂方法:** Scala中无法像Java那样通过子类覆盖工厂方法。 --- ##### 2. 延迟初始化模式 延迟...

    快学 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...

    最全programming in scala

    8. **流和迭代器**:书中解释了如何使用Scala的流和迭代器API来处理大量数据,以及如何构造和使用自定义迭代器。 9. **隐式参数和转换**:Scala允许通过隐式参数和隐式转换来简化代码,这一特性在处理依赖注入和...

    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中,可以通过定义一个工厂接口,然后由不同的实现类提供具体的工厂方法来创建相关的产品对象,以此实现...

    Manning Early Access Program Functional Programming in Scala 10

    - 解析器组合子(Parser combinators):一种用函数式风格来构造解析器的方法。 第三部分:函数式设计模式 - Monoids:介绍了一个简单的抽象概念,即在保持操作的结合律下,一个可以进行组合的数据结构。 - Monads...

    柴油: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类是类型...

    4.样式类和模式匹配1

    3. **提取器模式**:使用 `unapply` 方法定义的自定义模式,可以解析复杂的对象结构。 4. **变量模式**:直接使用变量名作为模式,匹配成功时将值绑定到该变量。 5. **类型模式**:`case x: T`,检查 `x` 是否是...

    基于Java的源码-表达式语法解析库 parboiled.zip

    这种设计使得解析器的构造和维护变得直观,同时也方便进行错误处理和调试。 三、核心概念 1. **Actions**:在解析过程中执行的操作,如收集输入、验证数据或构建结果对象。Actions可以嵌入在解析规则中,当匹配...

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

    - **构造器简洁**:你可以通过逗号分隔的参数列表直接创建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...

Global site tag (gtag.js) - Google Analytics