You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Oliver Heger (JIRA)" <ji...@apache.org> on 2009/12/24 20:22:29 UTC
[jira] Commented: (LANG-576) Add methods for cloneables to
ObjectUtils
[ https://issues.apache.org/jira/browse/LANG-576?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12794483#action_12794483 ]
Oliver Heger commented on LANG-576:
-----------------------------------
I would like to see support for cloning in lang, too. LANG-307 suggests a {{CloneUtils}} class. {{CloneUtils}} also provides a method that tries to invoke {{clone()}} through reflection. So I think LANG-307 is a super set of this proposal. Maybe the implementations in these proposals can be merged?
> 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.