package test
trait PartitionStrategy extends Serializable {
/** Returns the partition number for a given edge. */
def getPartition(key: Int): Int
def loadMetisFile()
}
object PartitionStrategy {
def fromString(s: String): PartitionStrategy = s match {
case "MetisPartition" => MetisPartition
case _ => throw new IllegalArgumentException("Invalid PartitionStrategy: " + s)
}
case object MetisPartition extends PartitionStrategy {
val metisMap =new scala.collection.mutable.HashMap[Int,Int]
def loadMetisFile() {
mockLoadFile()
}
def mockLoadFile() {
try {
var id = 1 ;
while(id < 10000)
{
var partition = 5 ;
metisMap.put(id, partition)
id = id +1
}
println("size: " + metisMap.size)
} catch {
case ex: Exception => { // Handle missing file
ex.printStackTrace()
}
}
}
override def getPartition(src: Int): Int = {
var s = metisMap.get(src)
if(!s.isEmpty)
return s.getOrElse(0)
else
throw new IllegalArgumentException("Metis can't find partition!")
}
}
}
package test
object TestPartition2 {
def main(args :Array[String]){
try {
val partitionStrategy = PartitionStrategy.fromString("MetisPartition")
partitionStrategy.loadMetisFile
println(partitionStrategy.getPartition(555))
// println(MetisPartitioner.getMetisPartition(1))
} catch {
case ex: Exception => {
ex.printStackTrace()
}
}
}
总结:trait有人说像接口,但我觉得更像抽象类, 此外,参考这个文档:
http://blog.csdn.net/wangxiaotongfan/article/details/48242029
注意几点:
注意:object不能提供构造器参数,也就是说object必须是无参的