Clone and Deep clone : Reflection « Development « Android






Clone and Deep clone

    
/* 
 * AFreeChart : a free chart library for Android(tm) platform.
 *              (based on JFreeChart and JCommon)
 * 
 *
 * (C) Copyright 2010, by Icom Systech Co., Ltd.
 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
 *
 * Project Info:
 *    AFreeChart: http://code.google.com/p/afreechart/
 *    JFreeChart: http://www.jfree.org/jfreechart/index.html
 *    JCommon   : http://www.jfree.org/jcommon/index.html
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * [Android is a trademark of Google Inc.]
 *
 * ---------------------
 * ObjectUtilitiess.java
 * ---------------------
 * 
 * (C) Copyright 2010, by Icom Systech Co., Ltd.
 *
 * Original Author:  shiraki  (for Icom Systech Co., Ltd);
 * Contributor(s):   Sato Yoshiaki ;
 *                   Niwano Masayoshi;
 *
 * Changes (from 19-Nov-2010)
 * --------------------------
 * 19-Nov-2010 : port JCommon 1.0.16 to Android as "AFreeChart"
 * 
 * ------------- JFreeChart ---------------------------------------------
 * (C) Copyright 2003-2005, by Object Refinery Limited.
 *
 * Original Author:  David Gilbert (for Object Refinery Limited);
 * Contributor(s):   -;
 *
 *
 * Changes
 * -------
 * 25-Mar-2003 : Version 1 (DG);
 * 15-Sep-2003 : Fixed bug in clone(List) method (DG);
 * 25-Nov-2004 : Modified clone(Object) method to fail with objects that
 *               cannot be cloned, added new deepClone(Collection) method.
 *               Renamed ObjectUtils --> ObjectUtilities (DG);
 * 11-Jan-2005 : Removed deprecated code in preparation for 1.0.0 release (DG);
 * 18-Aug-2005 : Added casts to suppress compiler warnings, as suggested in
 *               patch 1260622 (DG);
 *
 */

package org.afree.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.Iterator;

import android.util.Log;

/**
 * A collection of useful static utility methods for handling classes and object
 * instantiation.
 * 
 * @author Thomas Morgner
 */
final class ObjectUtilities {

  /**
   * Returns <code>true</code> if the two objects are equal OR both
   * <code>null</code>.
   * 
   * @param o1
   *            object 1 (<code>null</code> permitted).
   * @param o2
   *            object 2 (<code>null</code> permitted).
   * @return <code>true</code> or <code>false</code>.
   */
  public static boolean equal(final Object o1, final Object o2) {
    if (o1 == o2) {
      return true;
    }
    if (o1 != null) {
      return o1.equals(o2);
    } else {
      return false;
    }
  }

  /**
   * Returns a hash code for an object, or zero if the object is
   * <code>null</code>.
   * 
   * @param object
   *            the object (<code>null</code> permitted).
   * @return The object's hash code (or zero if the object is
   *         <code>null</code>).
   */
  public static int hashCode(final Object object) {
    int result = 0;
    if (object != null) {
      result = object.hashCode();
    }
    return result;
  }

  /**
   * Returns a clone of the specified object, if it can be cloned, otherwise
   * throws a CloneNotSupportedException.
   * 
   * @param object
   *            the object to clone (<code>null</code> not permitted).
   * @return A clone of the specified object.
   * @throws CloneNotSupportedException
   *             if the object cannot be cloned.
   */
  public static Object clone(final Object object)
      throws CloneNotSupportedException {
    if (object == null) {
      throw new IllegalArgumentException("Null 'object' argument.");
    }
    if (object instanceof PublicCloneable) {
      final PublicCloneable pc = (PublicCloneable) object;
      return pc.clone();
    } else {
      try {
        final Method method = object.getClass().getMethod("clone",
            (Class[]) null);
        if (Modifier.isPublic(method.getModifiers())) {
          return method.invoke(object, (Object[]) null);
        }
      } catch (NoSuchMethodException e) {
        Log.w("ObjectUtilities",
            "Object without clone() method is impossible.");
      } catch (IllegalAccessException e) {
        Log.w("ObjectUtilities",
            "Object.clone(): unable to call method.");
      } catch (InvocationTargetException e) {
        Log.w("ObjectUtilities",
            "Object without clone() method is impossible.");
      }
    }
    throw new CloneNotSupportedException("Failed to clone.");
  }

  /**
   * Returns a new collection containing clones of all the items in the
   * specified collection.
   * 
   * @param collection
   *            the collection (<code>null</code> not permitted).
   * @return A new collection containing clones of all the items in the
   *         specified collection.
   * @throws CloneNotSupportedException
   *             if any of the items in the collection cannot be cloned.
   */
  public static Collection deepClone(final Collection collection)
      throws CloneNotSupportedException {

    if (collection == null) {
      throw new IllegalArgumentException("Null 'collection' argument.");
    }
    // all JDK-Collections are cloneable ...
    // and if the collection is not clonable, then we should throw
    // a CloneNotSupportedException anyway ...
    final Collection result = (Collection) ObjectUtilities
        .clone(collection);
    result.clear();
    final Iterator iterator = collection.iterator();
    while (iterator.hasNext()) {
      final Object item = iterator.next();
      if (item != null) {
        result.add(clone(item));
      } else {
        result.add(null);
      }
    }
    return result;
  }

}

/**
 * An interface that exposes the clone() method.
 * 
 * @author David Gilbert
 */
interface PublicCloneable extends Cloneable {

  /**
   * Returns a clone of the object.
   * 
   * @return A clone.
   * 
   * @throws CloneNotSupportedException
   *             if cloning is not supported for some reason.
   */
  public Object clone() throws CloneNotSupportedException;

}

   
    
    
    
  








Related examples in the same category

1.Function that get the size of an object.
2.Basically Class.getMethod but allows for a list of parameter types instead of a variable arguments list.