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有包对象之前已经存在的遗留

 

posted on 2014-09-15 15:38  宁 弘道  阅读(649)  评论(0编辑  收藏  举报

导航