日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Scala的構(gòu)造方法與重載的一些思考

編輯推薦:Scala編程語言專題

Scala的構(gòu)造方法非常靈活(具體怎么個(gè)靈活法這里不多說了),但隨之而來的是重載構(gòu)造方法的麻煩。

Scala的構(gòu)造方法:重載的麻煩

例如定義新異常類型。一般來說,自己定義的異常都屬于checked異常,大都從Exception繼承過來,所以也大都需要定義多個(gè)構(gòu)造方法。如果用Java來定義,沒什么好說的,重載就行,但是用Scala的話就有點(diǎn)麻煩。Scala規(guī)定所有重載的構(gòu)造方法都必須調(diào)用或間接調(diào)用默認(rèn)構(gòu)造方法,所以必須使用如下的方法。

 
 
 
  1. MyException(message: String, cause: Throwable) extends Exception(message, cause) {
  2.   def this(message: String): = this(message, null)
  3.   def this(cause: Throwable): = this(null, cause)
  4.   def this: = this(nullnull)

當(dāng)然,這樣是可以工作的,但是仔細(xì)看看Throwable的實(shí)現(xiàn)就會(huì)發(fā)現(xiàn)如果傳入的cause為null話會(huì)導(dǎo)致異常棧的丟失。而且最惡心的是Throwable沒有提供相應(yīng)的setter/getter,我們能做的就是調(diào)用構(gòu)造方法。

所以我就想出了下面的怪招。

 
 
 
  1. object SpcException {
  2.   def apply(message: String, cause: Throwable): Exception =
  3.     (new SpcException1(message, cause)).asInstanceOf[Exception]
  4.  
  5.   def apply(message: String): Exception =
  6.     (new SpcException2(message)).asInstanceOf[Exception]
  7.  
  8.   def apply(cause: Throwable): Exception =
  9.     (new SpcException3(cause)).asInstanceOf[Exception]
  10.  
  11.   def apply(): Exception =
  12.     (new SpcException4).asInstanceOf[Exception]
  13. }
  14.  
  15. trait SpcException
  16.  
  17. class SpcException1(message: String, cause: Throwable)
  18.     extends Exception(message, cause) with SpcException
  19.  
  20. class SpcException2(message: String)
  21.     extends Exception(message) with SpcException
  22.  
  23. class SpcException3(cause: Throwable)
  24.     extends Exception(cause) with SpcException
  25.  
  26. class SpcException4 extends Exception with SpcException 

基本思想是定義一個(gè)trait,然后定義四種異常,每種都從該trait擴(kuò)展并提供不同的默認(rèn)構(gòu)造方法,同時(shí)定義一個(gè)singleton,提供四種不同的apply方法用來構(gòu)造四種不同的異常。這樣就可以解決之前的問題,雖然不怎么好看。

以上就是對Scala的構(gòu)造方法定義異常的一些考慮。本文來自Honnix的博客:《我是如何用Scala定義新異常類型的》


分享標(biāo)題:Scala的構(gòu)造方法與重載的一些思考
網(wǎng)頁路徑:http://www.dlmjj.cn/article/dpjcpdc.html