commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Henri Yandell (JIRA)" <>
Subject [jira] Closed: (LANG-575) HashCodeBuilder reflectionAppend creates unnecessary copy of excludeFields
Date Sat, 09 Jan 2010 11:46:54 GMT


Henri Yandell closed LANG-575.

    Resolution: Fixed

svn ci -m "Replacing the creation of a List in the core of each Builder class to test contains
on the excludeFields with a call to ArrayUtils.contains. Reported by Anthony Whitford in LANG-575"
Sending        src/main/java/org/apache/commons/lang3/builder/
Sending        src/main/java/org/apache/commons/lang3/builder/
Sending        src/main/java/org/apache/commons/lang3/builder/
Transmitting file data ...
Committed revision 897421.

> HashCodeBuilder reflectionAppend creates unnecessary copy of excludeFields
> --------------------------------------------------------------------------
>                 Key: LANG-575
>                 URL:
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.builder.*
>    Affects Versions: 2.4
>         Environment: Sun Java JDK 1.6.0_17
>            Reporter: Anthony Whitford
>             Fix For: 3.0
> See
> Please review the implementation for *reflectionAppend* (lines 174 to 202)...  Specifically,
see line 182:
> {code}
> List<String> excludedFieldList = excludeFields != null ? Arrays.asList(excludeFields)
: Collections.<String>emptyList();
> {code}
> Note that if you are in the habit of passing in a String array for excluding fields ({{String[]
excludeFields}}) -- which is a best practice when using Hibernate (to skip primary keys ({{@id}})
and version fields ({{@version}}) that change upon persistence) -- _EVERY TIME_ the _hashCode_
is calculated, an _ArrayList_ is being created -- generating fodder for the garbage collector.
> I thought I might get around this by passing a {{Collection<String>}} instead of
a {{String[]}}, but ironically the implementation of the {{reflectionHashCode(Object object,
Collection<String> excludeFields)}} (see lines 475 to 477), for example, transforms
the {{Collection<String>}} into a {{String[]}} only to have it transformed internally
into a temporary {{ArrayList<String>}}.
> I would expect the implementation to use and read what is submitted, whether that is
a {{String[]}} or a {{Collection<String>}}.  I don't think it needs to create another
copy just to have a convenient {{contains}} method.  Efficiency is important, especially in
the event of rehashing.

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

View raw message