一个包移动到另一个包往往为包层次的增长带来痛苦,你需要修改(bump)类库的版本号并且在你的发布申明中说明有哪些不合适的命名已经做了更改(比如:就象Sun公司在几年前处理Swing的包名一样)。以我的经验,类库的使用者更容易接受一些较小的、短期的痛苦,它们可以偶尔在一些重要的申明中对更改做个说明,申明确保公司的类库结构不会允许恶化到变成一种负担,反而成为公司的关键资产。(现今,许多的Java工具支撑这种动态的包层次,并且使得包名称和结构的更改尽可能的没有痛苦)。
包范围(package-scope)的声明
与包声明有着紧密联系的、也是很少会被Java教授者(包括书本)很好解释的、同时也可能很少被Java新手所消化吸收的另外一个Java语言特征就是:如何能正确定义类成员的(访问)范围(比如:域、方法、构建器,以及内嵌类(从Java1.1版本以后))。
没有人会对public和private访问范围有任何问题。它们之所以能被很好的理解的原因是它们意义明确,因此通常能够合适的被使用。而对于protected访问范围,则经常完全地被误解;当谈到包范围时,我们已经进入了一个真正可感知的灾难区域。
Java设计者错误的把包范围设计为缺省范围,因此它是关键字无关的包声明(所有的包都应该有关键字,没有的话就看做是缺省的包)。缺乏明显关键字是问题的根源所在:大多数的Java丛书和教程在最开始几章里的介绍中往往遗了对包范围相关的语法以及规则的介绍,这也是因为在介绍大多数的经典程序例子的时候正确的包范围问题并不是很有必要做一强调。
所以我们都被教授使用缺省的包范围声明,因为它不需要任何的关键字,因此允许我们不用任何的考虑就可以使用它了(又一个老套的懒惰标志...)。
当然,随着您Java技巧的熟练,您会逐渐认识到为类成员,尤其是域、方法以及构建器正确地设定包范围是非常重要和必须的。
域的访问范围声明:通常总是会出错
对于域来说,大约90%的的情况下都是被声明为私有类型。这是作为面向对象技术重要部分之一,封装所直接带来的结果。其次,面向对象阵营中大多数的意见是,在大多数的情况下,对象的组合比对象继承更为适合,因此受保护的访问指示符(protected)应该比私有访问指示符(private)被使用的频率低的多。你有必要把域声明为共有的(public)的唯一理由是当你要把一些常量暴露出来的时候,就象下面的情况:
public static final XXXX THE_CONSTANT;
域声明为包范围方式应该和声明非常量域为公有类型应该被视为同样的不可接受,这是因为这两种方式都破坏了对象的封装性,把他们自己的实现细节暴露出来。然而,声明为包范围的域在任何类型的Java源码中都可以看到,比如书、文章、新闻组,最后一个(决不会少见),在产品代码中。这里给出一个来自核心库中的例子(Sun的实现):在类javax.swing.ImageIcon中声明了这样一个域:
transient int loadStatus = 0;
请注意这个声明是如何包含了一个隐性的访问范围的声明,然而实际上在包javax.swing中没有任何的类来访问ImageIcon对象中的这个域。实际上,因为ImageIcon同时还声明了一个公有的对该域状态的访问控制符:
public int getImageLoadStatus(){
return loadStatus;
}
很明显的是,这个域应该被声明私有的。
方法和构造器包范围的声明
和域包范围相比较,方法和构造器的包范围定义更复杂一些。它们两者都可以被声明为以下四种访问范围:
# 公有的(Public):适用于所有的情况,都可以被访问
# 受保护的(Protected):只有子类才可以访问
# 私有的(Private):只有它自己可以访问
# 友好的(缺省):只有在同一个包下面的(不包含子目录)可以访问
明显地,如果一个子系统或者模块存在于系统自己的包下面,那么方法和构造器的包范围的声明通常是最合理的并且通常也是必须的。
Good things come in small packages
包的声明通常必须是作为第一行非注释语句出现在Java代码中的,然而,在Java语言诞生了7年之后,大多数的程序员并没有真正的领略到正确应用package关键字所带来的好处的潜力。这个小关键字可以让你通过拆分并模块化系统的架构来解决整个项目的复杂程度,并且能让你创建出长期的软件开发过程框架以实现代码的重用。这个潜力再漂亮不过了!所以,下次你创建一个新的包的时候,应该更多的更彻底的考虑一下package这个关键字的作用。这将是一项明智的、也是长期的投资。
-------------------------------------------------------------------------
静态工具类仓库,一个个人的例子
每个程序员都有他自己喜欢的工具(类)集合。我自己经常用到的工具包是我的可信赖的静态工具类集合。所有下面列出的类都只包含静态方法,所以它们永远不会被实例化。这使得它们非常的简单易用(就象java.lang.Math一样)。
类名 位于包
AppKit org.lv.lego
ArrayKit org.lv.lego
BeansKit org.lv.lego.beans
CheckboxKit org.lv.lego.gui
ChoiceKit org.lv.lego.gui
CLIKit org.lv.lego
ColorKit
包范围(package-scope)的声明
与包声明有着紧密联系的、也是很少会被Java教授者(包括书本)很好解释的、同时也可能很少被Java新手所消化吸收的另外一个Java语言特征就是:如何能正确定义类成员的(访问)范围(比如:域、方法、构建器,以及内嵌类(从Java1.1版本以后))。
没有人会对public和private访问范围有任何问题。它们之所以能被很好的理解的原因是它们意义明确,因此通常能够合适的被使用。而对于protected访问范围,则经常完全地被误解;当谈到包范围时,我们已经进入了一个真正可感知的灾难区域。
Java设计者错误的把包范围设计为缺省范围,因此它是关键字无关的包声明(所有的包都应该有关键字,没有的话就看做是缺省的包)。缺乏明显关键字是问题的根源所在:大多数的Java丛书和教程在最开始几章里的介绍中往往遗了对包范围相关的语法以及规则的介绍,这也是因为在介绍大多数的经典程序例子的时候正确的包范围问题并不是很有必要做一强调。
所以我们都被教授使用缺省的包范围声明,因为它不需要任何的关键字,因此允许我们不用任何的考虑就可以使用它了(又一个老套的懒惰标志...)。
当然,随着您Java技巧的熟练,您会逐渐认识到为类成员,尤其是域、方法以及构建器正确地设定包范围是非常重要和必须的。
域的访问范围声明:通常总是会出错
对于域来说,大约90%的的情况下都是被声明为私有类型。这是作为面向对象技术重要部分之一,封装所直接带来的结果。其次,面向对象阵营中大多数的意见是,在大多数的情况下,对象的组合比对象继承更为适合,因此受保护的访问指示符(protected)应该比私有访问指示符(private)被使用的频率低的多。你有必要把域声明为共有的(public)的唯一理由是当你要把一些常量暴露出来的时候,就象下面的情况:
public static final XXXX THE_CONSTANT;
域声明为包范围方式应该和声明非常量域为公有类型应该被视为同样的不可接受,这是因为这两种方式都破坏了对象的封装性,把他们自己的实现细节暴露出来。然而,声明为包范围的域在任何类型的Java源码中都可以看到,比如书、文章、新闻组,最后一个(决不会少见),在产品代码中。这里给出一个来自核心库中的例子(Sun的实现):在类javax.swing.ImageIcon中声明了这样一个域:
transient int loadStatus = 0;
请注意这个声明是如何包含了一个隐性的访问范围的声明,然而实际上在包javax.swing中没有任何的类来访问ImageIcon对象中的这个域。实际上,因为ImageIcon同时还声明了一个公有的对该域状态的访问控制符:
public int getImageLoadStatus(){
return loadStatus;
}
很明显的是,这个域应该被声明私有的。
方法和构造器包范围的声明
和域包范围相比较,方法和构造器的包范围定义更复杂一些。它们两者都可以被声明为以下四种访问范围:
# 公有的(Public):适用于所有的情况,都可以被访问
# 受保护的(Protected):只有子类才可以访问
# 私有的(Private):只有它自己可以访问
# 友好的(缺省):只有在同一个包下面的(不包含子目录)可以访问
明显地,如果一个子系统或者模块存在于系统自己的包下面,那么方法和构造器的包范围的声明通常是最合理的并且通常也是必须的。
Good things come in small packages
包的声明通常必须是作为第一行非注释语句出现在Java代码中的,然而,在Java语言诞生了7年之后,大多数的程序员并没有真正的领略到正确应用package关键字所带来的好处的潜力。这个小关键字可以让你通过拆分并模块化系统的架构来解决整个项目的复杂程度,并且能让你创建出长期的软件开发过程框架以实现代码的重用。这个潜力再漂亮不过了!所以,下次你创建一个新的包的时候,应该更多的更彻底的考虑一下package这个关键字的作用。这将是一项明智的、也是长期的投资。
-------------------------------------------------------------------------
静态工具类仓库,一个个人的例子
每个程序员都有他自己喜欢的工具(类)集合。我自己经常用到的工具包是我的可信赖的静态工具类集合。所有下面列出的类都只包含静态方法,所以它们永远不会被实例化。这使得它们非常的简单易用(就象java.lang.Math一样)。
类名 位于包
AppKit org.lv.lego
ArrayKit org.lv.lego
BeansKit org.lv.lego.beans
CheckboxKit org.lv.lego.gui
ChoiceKit org.lv.lego.gui
CLIKit org.lv.lego
ColorKit
| 对此文章发表了评论 |
