66.scala编程思想笔记——构造器和异常

时间:2022-08-13 19:31:17

66.scala编程思想笔记——构造器和异常

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50458751
源码下载连接请见第一篇笔记。         

构造器在创建对象。

         New表达式除了返回新创建的对象外,不能返回其他任何信息。

         但返回只构造了部分的对象也是无用的,客户端程序员会很轻易地认为这个对象是没问题的。

         解决这个问题有两个基本方法:

a)        编写一个简单到不会失败的构造器。

b)        在失败时抛出异常。

         伴随对象给了我们第三种选择:因为apply通常被写成一个用来生成新对象的工厂,并且他是方法而不是构造器,所以可以从aplly返回错误信息。如下:

package codelisting

import java.io.FileNotFoundException

 

class ExtensionException(name:String)

  extendsException(

   s"$name doesn't end with '.scala'")

 

class CodeListing(val fileName:String)

extends collection.IndexedSeq[String] {

 if(!fileName.endsWith(".scala"))

    throw newExtensionException(fileName)

  val vec =io.Source.fromFile(fileName)

   .getLines.toVector

  defapply(idx:Int) = vec(idx)

  def length =vec.length

}

 

object CodeListing {

  defapply(name:String) =

    try {

      newCodeListing(name)

    } catch {

      case_:FileNotFoundException =>

       Vector(s"File Not Found: $name")

      case_:NullPointerException =>

       Vector("Error: Null file name")

      casee:ExtensionException =>

       Vector(e.getMessage)

    }

}

 

在创建一个测试代码如下:

package codelistingtester

import com.atomicscala.AtomicTest._

 

class CodeListingTester(

 makeList:String => IndexedSeq[String]) {

 

 makeList("CodeListingTester.scala")(4) is

  "classCodeListingTester("

 

 makeList("NotAFile.scala")(0) is

  "FileNot Found: NotAFile.scala"

 

 makeList("NotAScalaFile.txt")(0) is

 "NotAScalaFile.txt " +

  "doesn'tend with '.scala'"

 

 makeList(null)(0) is

  "Error:Null file name"

 

}