You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Bernd (JIRA)" <ji...@apache.org> on 2015/05/27 10:33:17 UTC

[jira] [Commented] (LANG-1113) Manages Comparable in EqualsBuilder

    [ https://issues.apache.org/jira/browse/LANG-1113?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14560634#comment-14560634 ] 

Bernd commented on LANG-1113:
-----------------------------

we would need such a feature.

But it would not be sufficient, because more flexibility is needed.

BigDecimal is not the only type we need to be able to compare with a custom method.

for example: the new date-api in java8 (ZonedDateTime, LocalDate) provide a method "isEqual(..)" that can be used similar to the "compareTo(..)" method of the BigDecimal.

> Manages Comparable in EqualsBuilder
> -----------------------------------
>
>                 Key: LANG-1113
>                 URL: https://issues.apache.org/jira/browse/LANG-1113
>             Project: Commons Lang
>          Issue Type: New Feature
>          Components: lang.builder.*
>            Reporter: Simon Meyffret
>            Priority: Trivial
>              Labels: BigDecimal, EqualsBuilder
>             Fix For: Discussion
>
>
> As explained by LANG-393 and LANG-467, {{EqualsBuilder}} fails to provide a proper way to handle {{BigDecimal}} since {{BigDecimal}} takes the scale into account when using {{equals()}} but not with {{compareTo()}}.
> Would it be possible to add a method *{{appendComparable()}}* in {{EqualsBuilder}} to manages {{Comparable}} objects when we want to build equality on {{compareTo()}} and not {{equals()}}?
> Making clear that {{EqualsBuilder}} is not compliant with {{HashCodeBuilder}} when using this method.
> For example:
> {code:borderStyle=solid}
>     return new EqualsBuilder()
>         .append(this.name, other.name)
>         .appendComparable(this.amount, other.amount)
>         .isEqual();
> {code}
> with:
> {code:title=EqualsBuilder.java|borderStyle=solid}
> 	/**
> 	 * <p>Test if two <code>Comparable</code>s are equal using their
> 	 * <code>compareTo</code> method.</p>
> 	 * <p>This may break the <code>equals</code>/<code>hashcode</code> contract but
> 	 * it is useful in some situation, specially with {@link java.math.BigDecimal}.</p>
> 	 * 
> 	 * @param lhs  the left hand comparable
> 	 * @param rhs  the right hand comparable
> 	 * @return EqualsBuilder - used to chain calls.
> 	 */
> 	public <T extends Comparable<? super T>> EqualsBuilder appendComparable(T lhs, T rhs) {
> 		if (isEquals == false) {
> 			return this;
> 		}
> 		if (lhs == rhs) {
> 			return this;
> 		}
> 		if (lhs == null || rhs == null) {
> 			isEquals = false;
> 			return this;
> 		} else if (lhs.compareTo(rhs) != 0) {
> 			isEquals = false;
> 			return this;
> 		}
> 		return this;
> 	}
> 	
> 	/**
> 	 * <p>Performs a deep comparison of two <code>Comparable</code> arrays.</p>
> 	 * 
> 	 * @param lhs  the left hand <code>Comparable[]</code>
> 	 * @param rhs  the right hand <code>Comparable[]</code>
> 	 * @return EqualsBuilder - used to chain calls.
> 	 * @see #appendComparable(Comparable, Comparable)
> 	 */
> 	public <T extends Comparable<? super T>> EqualsBuilder appendComparable(T[] lhs, T[] rhs) {
> 		if (isEquals == false) {
> 			return this;
> 		}
> 		if (lhs == rhs) {
> 			return this;
> 		}
> 		if (lhs == null || rhs == null) {
> 			isEquals = false;
> 			return this;
> 		}
> 		if (lhs.length != rhs.length) {
> 			isEquals = false;
> 			return this;
> 		}
> 		for (int i = 0; i < lhs.length && isEquals; ++i) {
> 			appendComparable(lhs[i], rhs[i]);
> 		}
> 		return this;
> 	}
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)