You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Joerg Schaible (JIRA)" <ji...@apache.org> on 2010/02/11 00:24:29 UTC
[jira] Resolved: (LANG-576) Add methods for cloneables to
ObjectUtils
[ https://issues.apache.org/jira/browse/LANG-576?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Joerg Schaible resolved LANG-576.
---------------------------------
Resolution: Fixed
$ svn ci -m "Add methods for Cloneables to ObjectUtils (LANG-576)."
Sending src/main/java/org/apache/commons/lang3/ObjectUtils.java
Adding src/main/java/org/apache/commons/lang3/exception/CloneFailedException.java
Sending src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
Transmitting file data ...
Committed revision 908745.
> 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, CloneableTest.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.