天天看点

话说模式匹配(6) case类的细节

本质上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作为参数构造出结果,比如:

继续阅读