109、Scala编程进阶之package与import实战详解

package的概念

因为要对多个同名的类进行命名空间的管理,避免同名类发生冲突
比如说,scala.collection.mutable.Map和scala.collection.immutable.Map

package的定义

第一种方式: 多层级package定义(比较差的做法,一般不这么干)

package com {
    package zj {
        package scala {
            class Test {}
        }
    }
}

第二种方式: 串联式package定义(也不怎么样,一般也不这么干)

package com.zj.scala {
    package service {
        class Test {}
    }
}

第三种方式: 文件顶部package定义

package com.zj.scala.service

class Test {

}

第四种方式: IDE自动生成包

package特性

特性一: 同一个包定义,可以在不同的scala源文件中的; 一个scala源文件内,可以包含两个包
Test1.scala

package com {
    package zj {
        package scala {
            class Test1
        }
    }
}

Test2.scala

package com {
    package zj {
        package scala {
            class Test2
        }
    }
}

Test3.scala

package com {
    package zj {
        package scala1 {
            class Test
        }
    }
}

package com {
    package zj {
        package scala2 {
            class Test
        }
    }
}

特性二: 子包中的类,可以访问父包中的类

Test.scala

package com {
    package zj {
        package scala {
            object Utils {
                def isNotEmpty(str: String): Boolean = str != null && str != ""
            }
            
            class Test
        
            package service {
                class MyService {
                    def sayHello(name: String) {
                        if(Utils.isNotEmpty(name)) {
                            println("Hello, " + name)
                        } else {
                            println("Who are you?")  
                        }
                    }
                }
            }
        }
    }
}

object MainClass {
  def main(args: Array[String]): Unit = {
    val service = new com.zj.scala.service.MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

特性三: 相对包名与绝对包名

package com {
    package zj {
        package scala {
            object Utils {
                def isNotEmpty(str: String): Boolean = str != null && str != ""
            }
            
            class Test
            
            package collection {}
            
            package service {
                class MyService {
                    // 这会报错,默认使用相对报名,从com.zj.scala.collection包中,寻找mutable包下的ArrayBuffer类
                    // 但是找不到,所以会报错
                    // val names = new scala.collection.mutable.ArrayBuffer[String]
                    
                    // 正确的做法是使用_root_,引用绝对包名
                    val names = new _root_.scala.collection.mutable.ArrayBuffer[String]
                    
                    def sayHello(name: String) {
                        if(Utils.isNotEmpty(name)) {
                            println("Hello, " + name)
                        } else {
                            println("Who are you?")  
                        }
                    }
                }
            }
        }
    }
}

特性四: 定义package对象(比较少)

package内的成员,可以直接访问package对象内的成员

package com.zj.scala

package object service {
    val defaultName = "Somebody"
}

package service {
    class MyService {
        def sayHello(name: String) {
            if(name != null && name != "") {
                println("Hello, " + name)
            } else {
                println("Hello, " + defaultName) 
            }
        }
    }
}

特性五: package可见性

package com.zj.scala

class Person {
    private[scala] val name = "leo"
    private[zj] val age = 25
}

import

如果没有import,那么。。。你每次创建某个包下的类的对象,都得用new com.zj.scala.service.MyService这种冗长的格式。。。
所以如果用了import,那么。。。你只要先import com.zj.scala.service.MyService,然后再new MyService,即可。。。

import com.zj.scala.service.MyService;

object MainClass {
  def main(args: Array[String]): Unit = {
    val service = new MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

import特性

特性一: 用import com.zj.scala.service._这种格式,可以导入包下所有的成员

特性二: scala与java不同之处在于,任何地方都可以使用import,比如类内、方法内,这种方式的好处在于,可以在一定作用域范围内使用导入

object MainClass {
  def main(args: Array[String]): Unit = {
    import com.zj.scala.service._
    
    val service = new MyService
    service.sayHello("leo")  
    service.sayHello("")  
  }
}

特性三: 选择器、重命名、隐藏

import com.zj.scala.service.{ MyService },仅仅导入java.awt包下的Color和Font类
import com.zj.scala.service.{ MyService => MyServiceImpl },将导入的类进行重命名
import java.util.{ HashMap => _, _ },导入java.util包下所有的类,但是隐藏掉HashMap类

特性四: 隐式导入

每个scala程序默认都会隐式导入以下几个包下所有的成员

import java.lang._
import scala._
import Predef._
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容