JDK源码解析之 Java.lang.Boolean

2022-12-01 20:06:13 浏览数 (1)

Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。 此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。

一、类定义

代码语言:javascript复制
public final class Boolean implements java.io.Serializable,
                                      Comparable<Boolean>
{

实现的两个接口:

  • java.io.Serializable:可被序列化的标志接口
  • Comparable:强行对实现它的每个类的对象进行整体排序

二、成员变量

代码语言:javascript复制
    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");
    
    private final boolean value;

在内部维护了一个 boolean 类型的 value,在我们调用构造器的时候会将 value 给赋值。

还可以看到内部还有三个常量其中两个是 TRUE、FALSE 分别代表布尔值的两个状态,这样我们在使用的时候就可以直接用而不需要去构建一个。

还有一个 TYPE 是接收了 Class.getPrimitiveClass(“boolean”); 的返回值,我们跟进去可以看到 getPrimitiveClass 是一个 native 方法。

代码语言:javascript复制
static native Class<?> getPrimitiveClass(String name);

三、构造方法

代码语言:javascript复制
    public Boolean(boolean value) {
        this.value = value;
    }
		//调用parseBoolean(s)
    public Boolean(String s) {
        this(parseBoolean(s));
    }
		//字符串s忽略大小写后与“true”相等,则返回(Boolean)true
    public static boolean parseBoolean(String s) {
        return ((s != null) && s.equalsIgnoreCase("true"));
    }

四、普通方法

4.1、toString()

三目表达式

代码语言:javascript复制
    public String toString() {
        return value ? "true" : "false";
    }

    @Override
    public int hashCode() {
        return Boolean.hashCode(value);
    }
4.2、hashCode(boolean value)

即 true 返回 1231 而 false 返回 1237

代码语言:javascript复制
    public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }
4.3、getBoolean(String name)

获取系统属性

代码语言:javascript复制
    public static boolean getBoolean(String name) {
        boolean result = false;
        try {
            result = parseBoolean(System.getProperty(name));
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        return result;
    }
4.4、compareTo(Boolean b)

相同为0,this.value为true返回1,b.value为true返回-1

代码语言:javascript复制
    public int compareTo(Boolean b) {
        return compare(this.value, b.value);
    }

    public static int compare(boolean x, boolean y) {
        return (x == y) ? 0 : (x ? 1 : -1);
    }
4.5、逻辑运算
代码语言:javascript复制
    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;
    }
4.6、equals(Object obj)

先判断是不是从 Boolean 实例化出来的,然后再继续比较是不是相等。

代码语言:javascript复制
public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

4.7、官方推荐方式valueOf()

代码语言:javascript复制
    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

    public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }

    public static String toString(boolean b) {
        return b ? "true" : "false";
    }

五、总结

Boolean用两个final的静态变量来表示不同状态的实例,通常这个方法我们也可以借鉴,例如编写一个Weekday类,状态只有7个,就不要让用户写new Weekday(1),直接提供Weekday.MONDAY即可。

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

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

代码语言:javascript复制
public boolean equals(Object obj) {
    return this==obj;
}

0 人点赞