源码阅读-java基础-java.lang.Boolean
Boolean的源码我感觉是很简单的。真的!!!
1、类定义
public final class Boolean implements java.io.Serializable,Comparable<Boolean>{}
- final:表示不能被继承,也没有子类
- Serializable 表示类对象可以序列化到本地磁盘
- Comparable 表示类对象实现了对比,可作为列表对象使用列表的排序功能
2、构造方法
public Boolean(boolean value) {
this.value = value;
}
public Boolean(String s) {
this(parseBoolean(s));
}
3、静态变量
- TRUE、FALSE这两个变量在Class Loader装载时就被实例化,并且申明为final,不能再指向其他实例。提供这两个静态变量是为了让开
发者直接使用这两个变量而不是每次都new一个Boolean,这样既节省内存又避免了创建一个新实例的时间开销。
由此,用Boolean b = Boolean.TRUE;
比Boolean b = new Boolean(true);
要好的多。 - 如果遇到这种情况
Boolean b = new Boolean(var);
,一定要根据一个boolean变量来创建Boolean实例怎么办?推荐使用Boolean提供
的静态工厂方法:Boolean b = Boolean.valueOf(var);
,这样就可以避免创建新的实例。因为valueOf()的实现是return (b ? TRUE : FALSE);
。 - valueOf()这个静态工厂方法返回的仍然是两个静态变量TRUE和FALSE之一,而不是new一个Boolean出来。虽然Boolean非常简单,占用的内存也很
少,但是一个复杂的类用new创建实例的开销可能非常大,而且,使用工厂方法可以方便的实现缓存实例,这对客户端是透明的。所以,
能用工厂方法就不要使用new。 - 和Boolean只有两种状态不同,Integer也是不可变类,但是状态上亿种,不可能用静态实例缓存所有状态。不过,SUN的工程师还是作
了一点优化,Integer类缓存了-128到127这256个状态的Integer,如果使用Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");
4、成员变量
boolean的成员变量只有这一个,用于缓存boolean的数据。
private final boolean value;
5、静态方法
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
public static Boolean valueOf(String s) {
return parseBoolean(s) ? TRUE : FALSE;
}
public static boolean parseBoolean(String s) {
return ((s != null) && s.equalsIgnoreCase("true"));
}
public static String toString(boolean b) {
return b ? "true" : "false";
}
public static boolean getBoolean(String name) {
boolean result = false;
try {
result = parseBoolean(System.getProperty(name));
} catch (IllegalArgumentException | NullPointerException e) {
}
return result;
}
public static int compare(boolean x, boolean y) {
return (x == y) ? 0 : (x ? 1 : -1);
}
这几个逻辑连接的方法,我感觉调用是没啥必要,反而使代码不易读了。
public static boolean logicalAnd(boolean a, boolean b) {
return a && b;
}
public static boolean logicalOr(boolean a, boolean b) {
return a || b;
}
public static boolean logicalXor(boolean a, boolean b) {
return a ^ b;
}
Boolean的hashCode值,true=1231,false=1237
,为什么是这两个质数,不是其他的?网上资料是Boolean作者的个人喜好,这个
我也没查到原因。但是貌似哈希值都和“31”有或多或少的关系
public static int hashCode(boolean value) {
return value ? 1231 : 1237;
}
6、成员方法
public boolean booleanValue() {
return value;
}
public String toString() {
return value ? "true" : "false";
}
public int hashCode() {
return Boolean.hashCode(value);
}
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
public int compareTo(Boolean b) {
return compare(this.value, b.value);
}
7、总结
- 如果一个类只有有限的几种状态,考虑用几个final的静态变量来表示不同状态的实例。例如编写一个Weekday类,状态只有7个,就不要让用户写new Weekday(1),直接提供Weekday.MONDAY即可。
8、参考
在全栈的道路上,积极向上、成熟稳重、谦虚好学、怀着炽热的心向前方的走得更远。