Add methods for cloneables to ObjectUtils
-----------------------------------------

                 Key: LANG-576
                 URL: https://issues.apache.org/jira/browse/LANG-576
             Project: Commons Lang
          Issue Type: New Feature
          Components: lang.*
            Reporter: Joerg Schaible
            Assignee: Joerg Schaible
            Priority: Minor
             Fix For: 3.0


Object.clone is declared protected, which makes it impossible to write code 
like:
{code:java}
if (obj instanceof Cloneable) {
  Object clone = obj.clone();
  ...
}
{code}

Following two methods will help in such a situation:

{code:java}
    /**
     * Clone an object.
     * 
     * @param <T> the type of the object
     * @param o the object to clone
     * @return the clone if the object implements {...@link Cloneable} 
otherwise <code>null</code>
     * @throws CloneFailedException if the object is cloneable and the clone 
operation fails
     */
    public static <T> T clone(final T o) {
        if (o instanceof Cloneable) {
            try {
                final Method clone = o.getClass().getMethod("clone", 
(Class[])null);
                @SuppressWarnings("unchecked")
                final T result = (T)clone.invoke(o, (Object[])null);
                return result;
            } catch (final NoSuchMethodException e) {
                throw new CloneFailedException("Cloneable type has no clone 
method", e);
            } catch (final IllegalAccessException e) {
                throw new CloneFailedException("Cannot clone Cloneable type", 
e);
            } catch (final InvocationTargetException e) {
                throw new CloneFailedException("Exception cloning Cloneable 
type", e.getCause());
            }
        }

        return null;
    }

    /**
     * Clone an object if possible.
     * 
     * @param <T> the type of the object
     * @param o the object to clone
     * @return the clone if the object implements {...@link Cloneable} 
otherwise the object itself
     * @throws CloneFailedException if the object is cloneable and the clone 
operation fails
     */
    public static <T> T cloneIfPossible(final T o) {
        final T clone = clone(o);
        return clone == null ? o : clone;
    }
{code}

Comments?

Unit tests will be provided also.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to