使用控制抽象函數(shù)(貸出模式loan pattern)

(Scala編程P.173)打開某個資源,對它進(jìn)行操作,然后關(guān)閉這個資源宫静。可以用類似如下的方法券时,將這個模式捕獲成一個控制抽象孤里,withPrintWriter打開某個資源并將這個資源“貸出”給函數(shù)op

def withPrintWriter(file: File, op: PrintWriter => Unit): Unit = {
  val writer = new PrintWriter(file)
  try {
    op(writer)
  } finally {
    writer.close()
  }
}

withPrintWriter(
  new File("date.txt"),
  writer => writer.println(new java.util.Date)
)

實踐:

讀取配置文件,都是打開文件橘洞,讀取配置文件內(nèi)容捌袜,可以考慮貸出模式

ReadConfigFile.scala

import com.typesafe.config.{Config, ConfigFactory}

import scala.reflect.ClassTag

class ReadConfigFile[T:ClassTag](clz: Class[T]){
  def read(fileName: String)(fromConfig: Config => T): T = {  //柯里化
    val file = new File(fileName)
    if (!file.exists())  clz.newInstance()//不能直接new T(),scala不能識別,需要通過ClassTag,增加Class[T]入?yún)⒂谜ㄔ妫琻ewInstance來構(gòu)造一個新的對象虏等,而且這個對象不能帶入?yún)ⅰ?    else {
      println(s"path = $fileName")
      try {
        val conf:Config = ConfigFactory.parseFile(file).withFallback(ConfigFactory.load())
        fromConfig(conf)
      } catch {
        case ex: Exception => clz.newInstance()
      }
    }
  }
}

這里用到了泛型類,可以傳入對于任何需要讀取配置參數(shù)類适肠,將讀取文件的方法通過fromConfig函數(shù)值傳進(jìn)來

PersonConfig.scala

class PersonConfig{
  var name: String = ""
  var age: Int = 0

  override def toString: String = {
    "name=" + name + " age=" + age
  }
}

object PersonConfig{
  def createPersonConfig(config: Config): PersonConfig= {
    val PersonConfig= new PersonConfig
    PersonConfig.name = config.getString("name ")
    PersonConfig.age= config.getInt("age")
    PersonConfig
  }
}

ITDepartmentConfig.scala

class ITDepartmentConfigextends ReadConfigFile(classOf[PersonConfig]){
  private val personConfig: PersonConfig= {
    read("person.conf") { config =>
      PersonConfig.createServerConfig(config.getConfig("person_config"))
    }//傳入讀取文件的方法并生成相關(guān)的對象
  }

  def person: PersonConfig= personConfig
}

**Test.scala**
object Test {
  def main(args: Array[String]): Unit = {
    val itDepartmentConfig= new ITDepartmentConfig
    println(itDepartmentConfig.person.toString)
  }
}

上這里提到了不能直接new T()的問題霍衫,可以通過多加一個傳名參數(shù)來解決,就不需要使用ClassTag,使用ClassTag導(dǎo)致構(gòu)造函數(shù)中不可以帶入?yún)ⅰ7椒ㄈ缦拢?/p>

class ReadConfigFile[T]{
  def read(fileName: String)(fromConfig: Config => T)(emptyObject: => T): T = {
    val file = new File(fileName)
    if (!file.exists())  emptyObject
    else {
      println(s" path = $fileName ")
      try {
        val conf:Config = ConfigFactory.parseFile(file).withFallback(ConfigFactory.load())
        fromConfig(conf)
      } catch {
        case ex: Exception => emptyObject
      }
    }
  }
}

調(diào)用時

class RESTServerConfig extends ReadConfigFile[ServerConfig] with Subject {
  private val serverConfig: ServerConfig = {
    read(FileUtil.getConfigPath + "rest-server.conf") { config =>
      ServerConfig.createServerConfig(config.getConfig("rest_server_config"))
    }(new ServerConfig())
  }

  def server: ServerConfig = serverConfig
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淘菩,一起剝皮案震驚了整個濱河市勿璃,隨后出現(xiàn)的幾起案子焚挠,更是在濱河造成了極大的恐慌桥状,老刑警劉巖佩捞,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件域庇,死亡現(xiàn)場離奇詭異携兵,居然都是意外死亡疾掰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門徐紧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静檬,“玉大人,你說我怎么就攤上這事并级》鏖荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵嘲碧,是天一觀的道長稻励。 經(jīng)常有香客問我,道長愈涩,這世上最難降的妖魔是什么望抽? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮履婉,結(jié)果婚禮上煤篙,老公的妹妹穿的比我還像新娘。我一直安慰自己毁腿,他們只是感情好辑奈,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著已烤,像睡著了一般鸠窗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上草戈,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天塌鸯,我揣著相機(jī)與錄音侍瑟,去河邊找鬼唐片。 笑死,一個胖子當(dāng)著我的面吹牛涨颜,可吹牛的內(nèi)容都是我干的费韭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庭瑰,長吁一口氣:“原來是場噩夢啊……” “哼星持!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弹灭,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤督暂,失蹤者是張志新(化名)和其女友劉穎揪垄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逻翁,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饥努,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了八回。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷愧。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缠诅,靈堂內(nèi)的尸體忽然破棺而出溶浴,到底是詐尸還是另有隱情,我是刑警寧澤管引,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布士败,位于F島的核電站,受9級特大地震影響褥伴,放射性物質(zhì)發(fā)生泄漏拱烁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一噩翠、第九天 我趴在偏房一處隱蔽的房頂上張望戏自。 院中可真熱鬧,春花似錦伤锚、人聲如沸擅笔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猛们。三九已至,卻和暖如春狞洋,著一層夾襖步出監(jiān)牢的瞬間弯淘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工吉懊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留庐橙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓借嗽,卻偏偏與公主長得像态鳖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恶导,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容