Scala的構(gòu)造方法與重載的一些思考
51CTO編輯推薦:Scala編程語(yǔ)言專(zhuān)題
Scala的構(gòu)造方法非常靈活(具體怎么個(gè)靈活法這里不多說(shuō)了),但隨之而來(lái)的是重載構(gòu)造方法的麻煩。
Scala的構(gòu)造方法:重載的麻煩
例如定義新異常類(lèi)型。一般來(lái)說(shuō),自己定義的異常都屬于checked異常,大都從Exception繼承過(guò)來(lái),所以也大都需要定義多個(gè)構(gòu)造方法。如果用Java來(lái)定義,沒(méi)什么好說(shuō)的,重載就行,但是用Scala的話(huà)就有點(diǎn)麻煩。Scala規(guī)定所有重載的構(gòu)造方法都必須調(diào)用或間接調(diào)用默認(rèn)構(gòu)造方法,所以必須使用如下的方法。
- MyException(message: String, cause: Throwable) extends Exception(message, cause) {
- def this(message: String): = this(message, null)
- def this(cause: Throwable): = this(null, cause)
- def this: = this(null, null)
- }
當(dāng)然,這樣是可以工作的,但是仔細(xì)看看Throwable的實(shí)現(xiàn)就會(huì)發(fā)現(xiàn)如果傳入的cause為null話(huà)會(huì)導(dǎo)致異常棧的丟失。而且最?lèi)盒牡氖荰hrowable沒(méi)有提供相應(yīng)的setter/getter,我們能做的就是調(diào)用構(gòu)造方法。
所以我就想出了下面的怪招。
- object SpcException {
- def apply(message: String, cause: Throwable): Exception =
- (new SpcException1(message, cause)).asInstanceOf[Exception]
- def apply(message: String): Exception =
- (new SpcException2(message)).asInstanceOf[Exception]
- def apply(cause: Throwable): Exception =
- (new SpcException3(cause)).asInstanceOf[Exception]
- def apply(): Exception =
- (new SpcException4).asInstanceOf[Exception]
- }
- trait SpcException
- class SpcException1(message: String, cause: Throwable)
- extends Exception(message, cause) with SpcException
- class SpcException2(message: String)
- extends Exception(message) with SpcException
- class SpcException3(cause: Throwable)
- extends Exception(cause) with SpcException
- class SpcException4 extends Exception with SpcException
基本思想是定義一個(gè)trait,然后定義四種異常,每種都從該trait擴(kuò)展并提供不同的默認(rèn)構(gòu)造方法,同時(shí)定義一個(gè)singleton,提供四種不同的apply方法用來(lái)構(gòu)造四種不同的異常。這樣就可以解決之前的問(wèn)題,雖然不怎么好看。
以上就是對(duì)Scala的構(gòu)造方法定義異常的一些考慮。本文來(lái)自Honnix的博客:《我是如何用Scala定義新異常類(lèi)型的》
【編輯推薦】