前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK源码解析之 Java.lang.Boolean

JDK源码解析之 Java.lang.Boolean

作者头像
栗筝i
发布2022-12-01 20:06:13
2520
发布2022-12-01 20:06:13
举报
文章被收录于专栏:迁移内容迁移内容

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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、类定义
  • 二、成员变量
  • 三、构造方法
  • 四、普通方法
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档