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"
}