本质上case class是个语法糖,对你的类构造参数增加了getter访问,还有tostring, hashcode, equals 等方法; 最重要的是帮你实现了一个伴生对象,这个伴生对象里定义了<code>apply</code>方法和<code>unapply</code>方法。
现在我们来详细的分析一下<code>case class</code>,对一个简单的样本类
反编译后看到编译器自动给它混入了<code>product</code>特质,以及<code>serializable</code>特质:
再看看它的半生对象:
通过反编译的结果我们了解到了几点:
编译器对case类混入了<code>product</code>特质
编译器对case类增加了<code>copy</code>方法;
编译器对case类实现了<code>equals/hashcode/tostring</code>等方法
伴生对象中最重要的方法是 unapply 这个方法是在进行构造器模式匹配时的关键。
伴生对象中<code>apply</code>方法则为创建对象提供方便,相当于工厂方法。
伴生对象继承了<code>abstractfunction</code>
从case类的设计目的来看,最重要的是提供构造器模式匹配(且构造时的参数,与解构的结果一致),另外case类可看作是数据对象,不可变的数据对象。
因为case类封装的数据有不变的特点,以及可以进行模式匹配,所以它在actor中经常使用,很适合封装消息在actor之间传递。
the reason why case class companion objects implement functionn is that before, case classes generated a class and a factory method, not a companion object. when we added extractors to scala it made more sense to turn the factory method into a full companion object with apply and unapply methods. but then, since the factory method did conform to functionn, the companion object needed to conform, too.
另外,当参数大于2个时,functionn 都提供了tupled方法生成一个函数,该函数可以接受一个tuple作为参数构造出结果,比如: