首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java开源>正文

JDK源码分析:java.lang.Boolean

http://www.oklinux.cn  2008-03-07  来源: ccidnet baocl  会员收藏  游客收藏  【 】 

闲来无事,开始研究JDK源码(jdk 1.5 b2),先找了一个最简单的java.lang.Boolean开始解剖。

由于水平有限,难免有不少错误,还请大家指正!

首先我们剔除所有的方法和静态变量,Boolean的核心代码如下:

public final class Boolean implements java.io.Serializable,Comparable
{
private final boolean value;
}

很明显,凡是成员变量都是final类型的,一定是immutable class,这个Boolean和String一样,一旦构造函数执行完毕,实例的状态就不能再改变了。

Boolean的构造函数有两个:

public Boolean(boolean value) {
this.value = value;
}
public Boolean(String s) {
this);
}

都很简单就不多说了。

另外注意到Boolean类实际上只有两种不同状态的实例:一个包装true,一个包装false,Boolean又是immutable class,所以在内存中相同状态的Boolean实例完全可以共享,不必用new创建很多实例。因此Boolean class还提供两个静态变量:

public static final Boolean TRUE = new Boolean;
public static final Boolean FALSE = new Boolean(false);

这两个变量在Class Loader装载时就被实例化,并且申明为final,不能再指向其他实例。

提供这两个静态变量是为了让开发者直接使用这两个变量而不是每次都new一个Boolean,这样既节省内存又避免了创建一个新实例的时间开销。

因此,用
Boolean b = Boolean.TRUE;

Boolean b = new Boolean;
要好得多。

如果遇到下面的情况:
Boolean b = new Boolean(var);
一定要根据一个boolean变量来创建Boolean实例怎么办?

推荐你使用Boolean提供的静态工厂方法:
Boolean b = Boolean.valueOf(var);
这样就可以避免创建新的实例,不信看看valueOf()静态方法:

public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}

这个静态工厂方法返回的仍然是两个静态变量TRUE和FALSE之一,而不是new一个Boolean出来。虽然Boolean非常简单,占用的内存也很少,但是一个复杂的类用new创建实例的开销可能非常大,而且,使用工厂方法可以方便的实现缓存实例,这对客户端是透明的。所以,能用工厂方法就不要用new。

和Boolean只有两种状态不同,Integer也是immutable class,但是状态上亿种,不可能用静态实例缓存所有状态。不过,SUN的工程师还是作了一点优化,Integer类缓存了-128到127这256个状态的Integer,如果使用Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。

hashCode()方法很奇怪,两种Boolean的hash code分别是1231和1237。估计写Boolean.java的人对这两个数字有特别偏好:

public int hashCode() {
return value ? 1231 : 1237;
}

equals()方法也很简单,只有Boolean类型的Object并且value相等才返true:

public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}

顺便提一句:很多人写equals()总是在第一行写:
if (obj==null) return false;
其实完全没有必要,因为如果obj==null,下一行的
if (obj instanceof Type)
就肯定返回false,因为(null instanceof AnyType) = false。
详细内容请参考《Effective Java》第7条:Obey the general contract when overriding equals。

其他的方法如toString()就更简单了,只要稍微熟悉java的程序员相信都能写出来,我就不多说了。

总结

1.如果一个类只有有限的几种状态,考虑用几个final的静态变量来表示不同状态的实例。
例如编写一个Weekday类,状态只有7个,就不要让用户写new Weekday(1),直接提供Weekday.MONDAY即可。

2.要防止用户使用new生成实例,就取消public构造函数,用户要获得静态实例的引用有两个方法:如果申明public static var就可以直接访问,比如Boolean.TRUE,
第二个方法是通过静态工厂方法:Boolean.valueOf(?)

3.如果不提供public构造函数,让用户只能通过上面的方法获得静态变量的引用,还可以大大简化equals()方法:
public boolean equals(Object obj) {

共2页: 上一页 1 [2] 下一页

上一篇:VC 中的Progress控件如何使用   下一篇:在C 程序中导出Word文档的方法


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·lucene2.0学习文档
·基于Eclipse 3.0的SWT编程
·开源技术 Eclipse使用技巧
·Apache开源项目分类列表
·开源技术:Eclipse 插件功能研究
·jICQ 服务器和客户端源码
·日志操作之JAVA-Apache
·开源技术:在Eclipse中构建备忘单
·开源技术之Tomcat数据源配置总结
·开源技术:tomcat5.0下配置ssl
·万能全文检索:Aperture
·开源搜索系统--Red-Piranha
·开创性的JSP定制标记应用
·在Struts2中集成Spring详细讲解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·在Struts2中集成Spring详细讲解
·开创性的JSP定制标记应用
·开源搜索系统--Red-Piranha
·万能全文检索:Aperture
·开源技术:tomcat5.0下配置ssl
·开源技术之Tomcat数据源配置总结
·开源技术:在Eclipse中构建备忘单
·开源技术:Eclipse 插件功能研究
·开源技术 Eclipse使用技巧
·基于Eclipse 3.0的SWT编程
·lucene2.0学习文档
·Apache开源项目分类列表
  阅读排行
·lucene2.0学习文档
·开源搜索系统--Red-Piranha
·基于Eclipse 3.0的SWT编程
·日志操作之JAVA-Apache
·开创性的JSP定制标记应用
·万能全文检索:Aperture
·开源技术:tomcat5.0下配置ssl
·开源技术之Tomcat数据源配置总结
·开源技术:在Eclipse中构建备忘单
·开源技术:Eclipse 插件功能研究
·开源技术 Eclipse使用技巧
·Apache开源项目分类列表
·jICQ 服务器和客户端源码
·在Struts2中集成Spring详细讲解
网摘收藏: