源码阅读-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、参考



posted @ 2020-12-07 14:37  Erneste  阅读(139)  评论(0编辑  收藏  举报