BooleanNode.java

package tools.jackson.databind.node;

import java.util.Optional;

import tools.jackson.core.*;
import tools.jackson.databind.SerializationContext;

/**
 * This concrete value class is used to contain boolean (true / false)
 * values. Only two instances are ever created, to minimize memory
 * usage.
 */
public class BooleanNode
    extends ValueNode
{
    private static final long serialVersionUID = 3L;

    // // Just need two instances...

    public final static BooleanNode TRUE = new BooleanNode(true);
    public final static BooleanNode FALSE = new BooleanNode(false);
    
    private final boolean _value;

    /*
    /**********************************************************************
    /* Construction
    /**********************************************************************
     */

    protected BooleanNode(boolean v) { _value = v; }

    // To support JDK serialization, recovery of Singleton instance
    protected Object readResolve() {
        return _value ? TRUE : FALSE;
    }

    public static BooleanNode getTrue() { return TRUE; }
    public static BooleanNode getFalse() { return FALSE; }

    public static BooleanNode valueOf(boolean b) { return b ? TRUE : FALSE; }

    /*
    /**********************************************************************
    /* Overridden JsonNode methods
    /**********************************************************************
     */

    @Override
    public JsonNodeType getNodeType() {
        return JsonNodeType.BOOLEAN;
    }

    @Override public JsonToken asToken() {
        return _value ? JsonToken.VALUE_TRUE : JsonToken.VALUE_FALSE;
    }

    @Override
    protected String _valueDesc() {
        return asString();
    }

    @Override
    public BooleanNode deepCopy() { return this; }

    /*
    /**********************************************************************
    /* Overridden JsonNode methods, scalar access
    /**********************************************************************
     */

    // // // Override "asBoolean()" methods as minor optimization
    
    @Override
    public final boolean asBoolean() {
        return _value;
    }

    @Override
    public final boolean asBoolean(boolean defaultValue) {
        return _value;
    }

    @Override
    public Optional<Boolean> asBooleanOpt() {
        return _value ? OPT_TRUE : OPT_FALSE;
    }
    
    @Override
    protected Boolean _asBoolean() {
        return _value;
    }

    @Override
    public boolean booleanValue() {
        return _value;
    }

    @Override
    public boolean booleanValue(boolean defaultValue) {
        return _value;
    }

    @Override
    public Optional<Boolean> booleanValueOpt() {
        return _value ? OPT_TRUE : OPT_FALSE;
    }

    @Override
    protected String _asString() {
        return _value ? "true" : "false";
    }

    /*
    /**********************************************************************
    /* Overridden JsonNode methods, other
    /**********************************************************************
     */

    @Override
    public final void serialize(JsonGenerator g, SerializationContext provider)
            throws JacksonException {
        g.writeBoolean(_value);
    }

    @Override
    public int hashCode() {
        return _value ? 3 : 1;
    }

    @Override
    public boolean equals(Object o)
    {
        /* 11-Mar-2013, tatu: Apparently ClassLoaders can manage to load
         *    different instances, rendering identity comparisons broken.
         *    So let's use value instead.
         */
        if (o == this) return true;
        if (o == null) return false;
        if (o instanceof BooleanNode otherNode) {
            return (_value == otherNode._value);
        }
        return false;
    }
}