Scala系列:package和import
包
作用:管理大型程序中的名称
源文件目录和包之间没有直接的关联关系;
包定义可以包含在多个scala文件中;
一个文件中可以定义多个包;
1 package com { 2 package hansight { 3 package scala { 4 object EventType extends Enumeration { 5 type EventType = Value 6 val DDOS, DI = Value 7 } 8 } 9 } 10 }
简单的包定义:
作用域规则:
相对包名:
可能导入混乱,
使用绝对包名:var arr = _root_.scala.collection.mutable.ArrayBuffer[EventType]
1 package com { 2 package hansight { 3 package scala { 4 object EventType extends Enumeration { 5 type EventType = Value 6 val DDOS, DI = Value 7 } 8 } 9 } 10 }
串联包:
1 package com.hansight.scala { // com 和 com.hansight包在这里不可见
2 object EventType extends Enumeration {
3 type EventType = Value
4 val DDOS, DI = Value
5 }
6 }
文件顶部标记法:
1 package com.hansight // 此包中的内容是可见的 2 package scala 3 object EventType extends Enumeration { 4 type EventType = Value 5 val DDOS, DI = Value 6 }
等同于
1 package com.hansight { // 此包中的内容是可见的 2 package scala { 3 object EventType extends Enumeration { 4 type EventType = Value 5 val DDOS, DI = Value 6 } 7 } 8 }
包对象
用于组织工具函数和常量
需要在父包中定义:
1 package com.hansight 2 package object people { 3 val defaultName = "scala examples" 4 } 5 package people { 6 class Person { 7 var name = defaultName 8 } 9 }
包可见性:
类成员在包中的可见度
1 package com.hansight 2 package object people { 3 val defaultName = "scala examples" 4 } 5 package people { 6 class Person { 7 var name = defaultName 8 private[people] def description = "people name:" + name; // people包内可见 9 } 10 }
也可以延伸到上级:
private[hansight] def description = "people name:" + name;
引入import
import语句让你使用更短的名称,而非完整名称。
引入某个包的全部成员:
import com.hansight.utils._ // _和Java中的*通配符一样,为什么用_?因为*可以作为包名
引入类或包的全部成员:
import com.hansihgt.utils.ESUtils._ // 就像Java中的import static,scala推荐使用
引入了包,便可使用较短名称访问子包:
import java.awt._
def handler(env: event.ActionHandler){ //TODO...} //event是java.awt的子包
在任何地方都可以使用import:
类里面
方法里面
引入包中多个成员
import java.awt.{Color, Font}
引入类并重命名
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable._
隐藏某个引入的类
import java.util.{HashMap => _, _} // 引入java.util下的所有成员,但HashMap不引入
隐式引入:
import java.lang._
import scala._ // 会覆盖java.lang中的引入
import Predef._ // 包含一些工具函数,在scala有包对象之前已经存在的遗留