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;
}