[ 
https://issues.apache.org/jira/browse/LANG-576?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Joerg Schaible updated LANG-576:
--------------------------------

    Description: 
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
     * @since 3.0
     */
    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
     * @since 3.0
     */
    public static <T> T cloneIfPossible(final T o) {
        final T clone = clone(o);
        return clone == null ? o : clone;
    }
{code}

Comments? Note, that the code currently introduces also a new 
CloneFailedException. Use another existing one?

Unit tests will be provided also.

  was:
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.


> 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
>
>         Attachments: Cloneable.diff
>
>
> 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
>      * @since 3.0
>      */
>     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
>      * @since 3.0
>      */
>     public static <T> T cloneIfPossible(final T o) {
>         final T clone = clone(o);
>         return clone == null ? o : clone;
>     }
> {code}
> Comments? Note, that the code currently introduces also a new 
> CloneFailedException. Use another existing one?
> 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