Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。
此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。
一、类定义
public final class Boolean implements java.io.Serializable,Comparable<Boolean>
{
实现的两个接口:
- java.io.Serializable:可被序列化的标志接口
- Comparable:强行对实现它的每个类的对象进行整体排序
二、成员变量
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 方法。
static native Class<?> getPrimitiveClass(String name);
三、构造方法
public Boolean(boolean value) {this.value = value;}//调用parseBoolean(s)public Boolean(String s) {this(parseBoolean(s));}//字符串s忽略大小写后与“true”相等,则返回(Boolean)truepublic static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}
四、普通方法
4.1、toString()
三目表达式
public String toString() {return value ? "true" : "false";}@Overridepublic int hashCode() {return Boolean.hashCode(value);}
4.2、hashCode(boolean value)
即 true 返回 1231 而 false 返回 1237
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)
获取系统属性
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
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、逻辑运算
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 实例化出来的,然后再继续比较是不是相等。
public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;
}
4.7、官方推荐方式valueOf()
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()方法:
public boolean equals(Object obj) {return this==obj;
}