001: // ============================================================================
002: // $Id: EqualTo.java,v 1.17 2006/08/07 03:59:48 davidahall Exp $
003: // Copyright (c) 2002-2005 David A. Hall
004: // ============================================================================
005: // The contents of this file are subject to the Common Development and
006: // Distribution License (CDDL), Version 1.0 (the License); you may not use this
007: // file except in compliance with the License. You should have received a copy
008: // of the the License along with this file: if not, a copy of the License is
009: // available from Sun Microsystems, Inc.
010: //
011: // http://www.sun.com/cddl/cddl.html
012: //
013: // From time to time, the license steward (initially Sun Microsystems, Inc.) may
014: // publish revised and/or new versions of the License. You may not use,
015: // distribute, or otherwise make this file available under subsequent versions
016: // of the License.
017: //
018: // Alternatively, the contents of this file may be used under the terms of the
019: // GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
020: // case the provisions of the LGPL are applicable instead of those above. If you
021: // wish to allow use of your version of this file only under the terms of the
022: // LGPL, and not to allow others to use your version of this file under the
023: // terms of the CDDL, indicate your decision by deleting the provisions above
024: // and replace them with the notice and other provisions required by the LGPL.
025: // If you do not delete the provisions above, a recipient may use your version
026: // of this file under the terms of either the CDDL or the LGPL.
027: //
028: // This library is distributed in the hope that it will be useful,
029: // but WITHOUT ANY WARRANTY; without even the implied warranty of
030: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
031: // ============================================================================
032:
033: package net.sf.jga.fn.comparison;
034:
035: import java.util.Comparator;
036:
037: /**
038: * Binary Predicate that returns TRUE for object arguments <b>x</b> and
039: * <b>y</b> when x == y using the built-in equals() method or an optional
040: * Comparator given at construction. By default, this functor will not throw
041: * NullPointerException: it will return true if both runtime arguments are null
042: * but false if only one is null. If an optional comparator is used, then its
043: * implementation will determine if a NullPointerException is thrown when passed
044: * a null argument.
045: * <p>
046: * To serialize an Equal functor, the comparator passed at construction(if any)
047: * must be Serializable.
048: * <p>
049: * Copyright © 2002-2005 David A. Hall
050: *
051: * @author <a href="mailto:davidahall@users.sourceforge.net">David A. Hall</a>
052: **/
053:
054: public class EqualTo<T> extends Equality<T> {
055:
056: static final long serialVersionUID = -8880072682296106379L;
057:
058: // An optional comparator used to compare values
059: Comparator<? super T> _comp;
060:
061: /**
062: * Builds an EqualTo that uses the built-in equals method.
063: */
064: public EqualTo() {
065: }
066:
067: /**
068: * Builds an EqualTo that uses the given comparator.
069: */
070: public EqualTo(Comparator<? super T> comp) {
071: _comp = comp;
072: }
073:
074: /**
075: * Returns the comparator in use by this functor, if any.
076: * @return the comparator in use by this functor, if any.
077: */
078: public Comparator<? super T> getComparator() {
079: return _comp;
080: }
081:
082: // BinaryFunctor interface
083:
084: /**
085: * Given arguments <b>x</b> and <b>y</b>, returns x.equals(y). Will not
086: * throw NullPointerException if either x or y are null: will return true
087: * if both x and y are null and false if either x or y are null.
088: *
089: * @return x.equals(y)
090: */
091: public Boolean fn(T x, T y) {
092: if (_comp == null)
093: return (x == null) ? y == null : x.equals(y);
094: else
095: return _comp.compare(x, y) == 0;
096: }
097:
098: /**
099: * Calls the Visitor's <code>visit(EqualTo)</code> method, if it
100: * implements the nested Visitor interface.
101: */
102: public void accept(net.sf.jga.fn.Visitor v) {
103: if (v instanceof EqualTo.Visitor)
104: ((EqualTo.Visitor) v).visit(this );
105: else
106: v.visit(this );
107: }
108:
109: // Object overrides
110:
111: public String toString() {
112: return "EqualTo";
113: }
114:
115: // Acyclic Visitor
116:
117: /**
118: * Interface for classes that may interpret an <b>EqualTo</b> predicate.
119: */
120: public interface Visitor extends net.sf.jga.fn.Visitor {
121: public void visit(EqualTo host);
122: }
123: }
|