001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      https://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.apache.commons.lang3.mutable;
019
020import java.io.Serializable;
021import java.util.concurrent.atomic.AtomicBoolean;
022
023import org.apache.commons.lang3.BooleanUtils;
024
025/**
026 * A mutable {@code boolean} wrapper.
027 * <p>
028 * This class was created before the introduction of {@link AtomicBoolean}.
029 * </p>
030 * <p>
031 * Note that as MutableBoolean does not extend {@link Boolean}, it is not treated by {@link String#format(String, Object...)} as a Boolean parameter.
032 * </p>
033 *
034 * @see Boolean
035 * @see AtomicBoolean
036 * @since 2.2
037 */
038public class MutableBoolean implements Mutable<Boolean>, Serializable, Comparable<MutableBoolean> {
039
040    /**
041     * Required for serialization support.
042     *
043     * @see java.io.Serializable
044     */
045    private static final long serialVersionUID = -4830728138360036487L;
046
047    /** The mutable value. */
048    private boolean value;
049
050    /**
051     * Constructs a new MutableBoolean with the default value of false.
052     */
053    public MutableBoolean() {
054    }
055
056    /**
057     * Constructs a new MutableBoolean with the specified value.
058     *
059     * @param value  the initial value to store
060     */
061    public MutableBoolean(final boolean value) {
062        this.value = value;
063    }
064
065    /**
066     * Constructs a new MutableBoolean with the specified value.
067     *
068     * @param value  the initial value to store, not null
069     * @throws NullPointerException if the object is null
070     */
071    public MutableBoolean(final Boolean value) {
072        this.value = value.booleanValue();
073    }
074
075    /**
076     * Returns the value of this MutableBoolean as a boolean.
077     *
078     * @return the boolean value represented by this object.
079     */
080    public boolean booleanValue() {
081        return value;
082    }
083
084    /**
085     * Compares this mutable to another in ascending order.
086     *
087     * @param other  the other mutable to compare to, not null
088     * @return negative if this is less, zero if equal, positive if greater
089     *  where false is less than true
090     */
091    @Override
092    public int compareTo(final MutableBoolean other) {
093        return BooleanUtils.compare(this.value, other.value);
094    }
095
096    /**
097     * Compares this object to the specified object. The result is {@code true} if and only if the argument is
098     * not {@code null} and is an {@link MutableBoolean} object that contains the same
099     * {@code boolean} value as this object.
100     *
101     * @param obj  the object to compare with, null returns false
102     * @return {@code true} if the objects are the same; {@code false} otherwise.
103     */
104    @Override
105    public boolean equals(final Object obj) {
106        if (obj instanceof MutableBoolean) {
107            return value == ((MutableBoolean) obj).booleanValue();
108        }
109        return false;
110    }
111
112    /**
113     * Gets the value as a Boolean instance.
114     *
115     * @return the value as a Boolean, never null.
116     * @deprecated Use {@link #get()}.
117     */
118    @Deprecated
119    @Override
120    public Boolean getValue() {
121        return Boolean.valueOf(this.value);
122    }
123
124    /**
125     * Returns a suitable hash code for this mutable.
126     *
127     * @return the hash code returned by {@code Boolean.TRUE} or {@code Boolean.FALSE}
128     */
129    @Override
130    public int hashCode() {
131        return value ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode();
132    }
133
134    /**
135     * Checks if the current value is {@code false}.
136     *
137     * @return {@code true} if the current value is {@code false}
138     * @since 2.5
139     */
140    public boolean isFalse() {
141        return !value;
142    }
143
144    /**
145     * Checks if the current value is {@code true}.
146     *
147     * @return {@code true} if the current value is {@code true}
148     * @since 2.5
149     */
150    public boolean isTrue() {
151        return value;
152    }
153
154    /**
155     * Sets the value to false.
156     *
157     * @since 3.3
158     */
159    public void setFalse() {
160        this.value = false;
161    }
162
163    /**
164     * Sets the value to true.
165     *
166     * @since 3.3
167     */
168    public void setTrue() {
169        this.value = true;
170    }
171
172    /**
173     * Sets the value.
174     *
175     * @param value  the value to set
176     */
177    public void setValue(final boolean value) {
178        this.value = value;
179    }
180
181    /**
182     * Sets the value from any Boolean instance.
183     *
184     * @param value  the value to set, not null
185     * @throws NullPointerException if the object is null
186     */
187    @Override
188    public void setValue(final Boolean value) {
189        this.value = value.booleanValue();
190    }
191
192    /**
193     * Gets this mutable as an instance of Boolean.
194     *
195     * @return a Boolean instance containing the value from this mutable, never null
196     * @since 2.5
197     */
198    public Boolean toBoolean() {
199        return Boolean.valueOf(booleanValue());
200    }
201
202    /**
203     * Returns the String value of this mutable.
204     *
205     * @return the mutable value as a string
206     */
207    @Override
208    public String toString() {
209        return String.valueOf(value);
210    }
211
212}