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 *      http://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 */
017package org.apache.commons.collections4.functors;
018
019import java.io.Serializable;
020
021import org.apache.commons.collections4.Predicate;
022
023/**
024 * Predicate implementation that returns true if the input is the same object
025 * as the one stored in this predicate.
026 *
027 * @param <T> the type of the input to the predicate.
028 * @since 3.0
029 */
030public final class IdentityPredicate<T> extends AbstractPredicate<T> implements Serializable {
031
032    /** Serial version UID */
033    private static final long serialVersionUID = -89901658494523293L;
034
035    /**
036     * Creates the identity predicate.
037     *
038     * @param <T> the type that the predicate queries
039     * @param object  the object to compare to
040     * @return the predicate
041     */
042    public static <T> Predicate<T> identityPredicate(final T object) {
043        if (object == null) {
044            return NullPredicate.<T>nullPredicate();
045        }
046        return new IdentityPredicate<>(object);
047    }
048
049    /** The value to compare to */
050    private final T iValue;
051
052    /**
053     * Constructor that performs no validation.
054     * Use {@code identityPredicate} if you want that.
055     *
056     * @param object  the object to compare to
057     */
058    public IdentityPredicate(final T object) {
059        iValue = object;
060    }
061
062    /**
063     * Gets the value.
064     *
065     * @return the value
066     * @since 3.1
067     */
068    public T getValue() {
069        return iValue;
070    }
071
072    /**
073     * Evaluates the predicate returning true if the input object is identical to
074     * the stored object.
075     *
076     * @param object  the input object
077     * @return true if input is the same object as the stored value
078     */
079    @Override
080    public boolean test(final T object) {
081        return iValue == object;
082    }
083
084}