Spark开发指南

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