You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Alan Green (JIRA)" <ji...@apache.org> on 2015/06/24 00:44:43 UTC
[jira] [Commented] (LANG-1062) Use Java 8 features to improve
EqualsBuilder
[ https://issues.apache.org/jira/browse/LANG-1062?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14598514#comment-14598514 ]
Alan Green commented on LANG-1062:
----------------------------------
A couple of thoughts:
1. The attribute access functions could be applied to both objects in the equality, so append only needs one argument:
{code}
return EqualsBuilder.test(this, obj).append(o -> o.id).isEquals();
{code}
2. It would make sense to provide a single function that accepts a collection of attribute access functions:
{code}
return EqualsBuilder.test(this, obj).appendAll(Arrays.asList(o -> o.id, o -> o.name, o -> o.color)).isEquals();
{code}
3. Since the common case is for hashCode and equality to work over the same member attributes, they could share this list:
{code}
private static final List<Function<ThisClass, ?>> EQUAL_ATTRS = Arrays.asList(o -> o.id, o -> o.name, o -> o.color);
public boolean equals(final Object obj) {
return EqualsBuilder.test(this, obj).appendAll(EQUAL_ATTRS).isEquals();
}
public int hashCode() {
return HashCodeBuilder.for(this).appendAll(EQUAL_ATTRS).build();
}
{code}
> Use Java 8 features to improve EqualsBuilder
> --------------------------------------------
>
> Key: LANG-1062
> URL: https://issues.apache.org/jira/browse/LANG-1062
> Project: Commons Lang
> Issue Type: Improvement
> Components: lang.builder.*
> Affects Versions: 3.3.2
> Reporter: Bruce Brouwer
> Fix For: 4.0
>
>
> Remove the need for boilerplate code still necessary with EqualsBuilder. Instead of checking for instanceOf or equality checks, it would be nice to be able to write this:
> {code}
> public boolean equals(final Object obj) {
> return EqualsBuilder.test(this, obj).append(this.id, o -> o.id).isEquals();
> }
> {code}
> I think this could generally work with a subclass of EqualsBuilder with a generic type, like this:
> {code}
> public class LambdaEqualsBuilder<T> extends EqualsBuilder {
> private final T obj;
> public LambdaEqualsBuilder(final T _this, final Object obj) {
> if (_this != obj && !_this.getClass().isInstance(obj)) {
> appendSuper(false);
> this.obj = null;
> } else {
> this.obj = (T) obj;
> }
> }
> public <P> LambdaEqualsBuilder<T> append(final P a, final Function<T, P> b) {
> if (isEquals()) {
> return (LambdaEqualsBuilder<T>) append(a, b.apply(obj));
> }
> return this;
> }
> // This might actually go in EqualsBuilder itself
> public static <E> LambdaEqualsBuilder<E> test(final E _this, final Object _that) {
> return new LambdaEqualsBuilder<E>(_this, _that);
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)