1 /* 2 * Copyright (C) 2007 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect; 18 19 import com.google.common.annotations.GwtCompatible; 20 import java.io.Serializable; 21 22 /** 23 * An abstract base class for implementing the <a 24 * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. The {@link 25 * #delegate()} method must be overridden to return the instance being decorated. 26 * 27 * <p>This class does <i>not</i> forward the {@code hashCode} and {@code equals} methods through to 28 * the backing object, but relies on {@code Object}'s implementation. This is necessary to preserve 29 * the symmetry of {@code equals}. Custom definitions of equality are usually based on an interface, 30 * such as {@code Set} or {@code List}, so that the implementation of {@code equals} can cast the 31 * object being tested for equality to the custom interface. {@code ForwardingObject} implements no 32 * such custom interfaces directly; they are implemented only in subclasses. Therefore, forwarding 33 * {@code equals} would break symmetry, as the forwarding object might consider itself equal to the 34 * object being tested, but the reverse could not be true. This behavior is consistent with the 35 * JDK's collection wrappers, such as {@link java.util.Collections#unmodifiableCollection}. Use an 36 * interface-specific subclass of {@code ForwardingObject}, such as {@link ForwardingList}, to 37 * preserve equality behavior, or override {@code equals} directly. 38 * 39 * <p>The {@code toString} method is forwarded to the delegate. Although this class does not 40 * implement {@link Serializable}, a serializable subclass may be created since this class has a 41 * parameter-less constructor. 42 * 43 * @author Mike Bostock 44 * @since 2.0 45 */ 46 @GwtCompatible 47 @ElementTypesAreNonnullByDefault 48 public abstract class ForwardingObject { 49 50 /** Constructor for use by subclasses. */ ForwardingObject()51 protected ForwardingObject() {} 52 53 /** 54 * Returns the backing delegate instance that methods are forwarded to. Abstract subclasses 55 * generally override this method with an abstract method that has a more specific return type, 56 * such as {@link ForwardingSet#delegate}. Concrete subclasses override this method to supply the 57 * instance being decorated. 58 */ delegate()59 protected abstract Object delegate(); 60 61 /** Returns the string representation generated by the delegate's {@code toString} method. */ 62 @Override toString()63 public String toString() { 64 return delegate().toString(); 65 } 66 67 /* No equals or hashCode. See class comments for details. */ 68 } 69