scala学习-11-package object
来源:互联网 发布:mac大脚插件是什么 编辑:程序博客网 时间:2024/06/03 20:23
Scala 2.8提供包对象(package object)的新特性。什么是包对象呢?按我的理解,根据Scala“一切皆对象”设计哲学,包(package)也是一种对象。既然是对象,那么就应该有属性和方法,也可以在包对象内声明某个类型的别名。举个例
package com{ package object ggd543{ type HashMap[A,B] = scala.collection.mutable.HashMap[A,B]; val HashMap = scala.collection.mutable.HashMap def print = println("hello, ggd543") } package object aiguozhe{ var name = "aiguozhe" def sayHello = println("hello") }}
可以看到,定义包对象跟定义一个普通的伴随对象(companion object)在写法上的唯一区别就是在关键字object 前加上 package 。
然后我们可以像使用伴随对象那样使用包对象,比如
object Test extends Application{ val myMap: com.ggd543.HashMap[String,String]= null; println(com.ggd543.HashMap) println(com.ggd543.print); println(com.aiguozhe.name) com.aiguozhe.name = "AIGUOZHE" println(com.aiguozhe.name)}
如果包对象的作用仅仅限于伴随对象那样,那scala 2.8完全没有必要引入这种特性。实际上包对象最重要的用途是兼容旧的类库,或者为某些数据类型提供增强版本。
比如在scala 2.7.7中,List是定义在scala包下的一个不可变集合类。这样做的目的是每次使用List的时候不需要显式地导入包名,因为List是一个使用很频繁的类。
在Scala中,包java.lang,包scala和伴随对象Predef里的所有数据类型,属性和方法会被自动导入到每个Scala文件中
然而另一方面,List由于具有不可变的特性,它应该归入scala.collection.immutable包中。因此在scala 2.8中,List被挪到scala.collection.immutable包下里,但这样一来2.8版本如何兼容2.7.7版本。于是Scala 2.8引入“包对象”这个特性来解决这个问题。如果你查阅Scala 2.8版本的API文档或源码,你会发现它定义了一个包对象:
package object scala { type List[+A] = scala.collection.immutable.List[A] val List = scala.collection.immutable.List}
也就是说scala.List相当于指向了scala.collection.immutable.List,从而保证升级到Scala 2.8版本不会对原有的程序造成影响。
可能有些读者会问,通过定义一个伴随对象scala 能否解决兼容的问题?但细想一下就发现不妥,因为scala包下的一切都要搬到这个伴随对象scala中去了,这似乎不太现实。实际上,Scala编译器会在scala包下创建一个叫package的类,这个类里面的内容就是package object scala中的东西, scala.List被翻译成scala.package.List, 但对于程序员来说是透明的 。同样道理也会在com.ggd543包和com.aiguozhe包下分别创建一个package类.
有了包对象这个新特性,我们不但解决了新旧版本的兼容性问题,还可以对旧的类库或第三方接口做一些包装或改进,而不需要额外创建一些类或接口(虽然实际上还是创建了一个类package,但这是编译器帮我们完成的)。比如在Play-scala module的0.8版本(http://www.playframework.org/modules/scala-0.8.zip)中,就对一些JPA接口进行了封装和改进:
import play.data.validation._import javax.persistencepackage play { package db { import annotation.target.field package object jpa{ //enums val CascadeType = CascadeTypeWrapper val LockModeType = LockModeTypeWrapper val FetchType = FetchTypeWrapper //classes type Table = persistence.Table type Entity = persistence.Entity type Inheritance = persistence.Inheritance //javax.persistence field type AttributeOverrides = persistence.AttributeOverrides @field type Basic = persistence.Basic @field type Column = persistence.Column @field // ...}
- scala学习-11-package object
- scala学习-11-package object
- scala学习七 package相关
- [Scala]Scala学习笔记五 Object
- 浅谈Scala 2.8的包对象(package object)
- 浅谈Scala 2.8的包对象(package object)
- Scala错误:object xml is not a member of package scala
- Scala 学习之 Class,Object, Trait
- Scala学习笔记 --- scala中class与object
- scala Object
- Scala--Import and Package
- Scala学习笔记4 (Object-Oriented Programming)
- Scala学习笔记4 (Object-Oriented Programming)
- Scala学习笔记4 (Object-Oriented Programming)
- scala学习13之与trait同名的object对象
- Scala 学习笔记(二)— Everything is an object
- 龟云狄眦-Scala学习札记【一】Scala中class、object、trait初识
- Scala教程(七)package实战
- 自定义view实现圆形加载
- 自定义view 随机数
- angularjs -返回顶部
- android项目开发中常用套路
- TLD算法的相关研究(2)
- scala学习-11-package object
- 自定义View之点击生成随机数
- 刮刮乐(自制)
- 将Dynamic Web projec转换Maven Project
- java基础学习总结——关于Java中的paint,repaint,update三个方法的关系
- [原]PHP内核中的神器之HashTable
- iOS 各种提示框
- 常用积分公式
- 使用Cookie存取用户登录信息