提交 83abbed3 编写于 作者: R rriggs

8029909: Clarify equals/hashcode behavior for java.time types

Summary: Document the behavior of equals and hashcode in java.time.chrono date types
Reviewed-by: sherman, scolebourne
上级 670d889f
...@@ -608,6 +608,48 @@ public final class HijrahDate ...@@ -608,6 +608,48 @@ public final class HijrahDate
return getChronology().period(Math.toIntExact(years), months, days); return getChronology().period(Math.toIntExact(years), months, days);
} }
//-------------------------------------------------------------------------
/**
* Compares this date to another date, including the chronology.
* <p>
* Compares this {@code HijrahDate} with another ensuring that the date is the same.
* <p>
* Only objects of type {@code HijrahDate} are compared, other types return false.
* To compare the dates of two {@code TemporalAccessor} instances, including dates
* in two different chronologies, use {@link ChronoField#EPOCH_DAY} as a comparator.
*
* @param obj the object to check, null returns false
* @return true if this is equal to the other date and the Chronologies are equal
*/
@Override // override for performance
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof HijrahDate) {
HijrahDate otherDate = (HijrahDate) obj;
return prolepticYear == otherDate.prolepticYear
&& this.monthOfYear == otherDate.monthOfYear
&& this.dayOfMonth == otherDate.dayOfMonth
&& getChronology().equals(otherDate.getChronology());
}
return false;
}
/**
* A hash code for this date.
*
* @return a suitable hash code based only on the Chronology and the date
*/
@Override // override for performance
public int hashCode() {
int yearValue = prolepticYear;
int monthValue = monthOfYear;
int dayValue = dayOfMonth;
return getChronology().getId().hashCode() ^ (yearValue & 0xFFFFF800)
^ ((yearValue << 11) + (monthValue << 6) + (dayValue));
}
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
/** /**
* Defend against malicious streams. * Defend against malicious streams.
......
...@@ -678,6 +678,18 @@ public final class JapaneseDate ...@@ -678,6 +678,18 @@ public final class JapaneseDate
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
/**
* Compares this date to another date, including the chronology.
* <p>
* Compares this {@code JapaneseDate} with another ensuring that the date is the same.
* <p>
* Only objects of type {@code JapaneseDate} are compared, other types return false.
* To compare the dates of two {@code TemporalAccessor} instances, including dates
* in two different chronologies, use {@link ChronoField#EPOCH_DAY} as a comparator.
*
* @param obj the object to check, null returns false
* @return true if this is equal to the other date
*/
@Override // override for performance @Override // override for performance
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
...@@ -690,6 +702,11 @@ public final class JapaneseDate ...@@ -690,6 +702,11 @@ public final class JapaneseDate
return false; return false;
} }
/**
* A hash code for this date.
*
* @return a suitable hash code based only on the Chronology and the date
*/
@Override // override for performance @Override // override for performance
public int hashCode() { public int hashCode() {
return getChronology().getId().hashCode() ^ isoDate.hashCode(); return getChronology().getId().hashCode() ^ isoDate.hashCode();
......
...@@ -440,6 +440,18 @@ public final class MinguoDate ...@@ -440,6 +440,18 @@ public final class MinguoDate
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
/**
* Compares this date to another date, including the chronology.
* <p>
* Compares this {@code MinguoDate} with another ensuring that the date is the same.
* <p>
* Only objects of type {@code MinguoDate} are compared, other types return false.
* To compare the dates of two {@code TemporalAccessor} instances, including dates
* in two different chronologies, use {@link ChronoField#EPOCH_DAY} as a comparator.
*
* @param obj the object to check, null returns false
* @return true if this is equal to the other date
*/
@Override // override for performance @Override // override for performance
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
...@@ -452,6 +464,11 @@ public final class MinguoDate ...@@ -452,6 +464,11 @@ public final class MinguoDate
return false; return false;
} }
/**
* A hash code for this date.
*
* @return a suitable hash code based only on the Chronology and the date
*/
@Override // override for performance @Override // override for performance
public int hashCode() { public int hashCode() {
return getChronology().getId().hashCode() ^ isoDate.hashCode(); return getChronology().getId().hashCode() ^ isoDate.hashCode();
......
...@@ -440,6 +440,18 @@ public final class ThaiBuddhistDate ...@@ -440,6 +440,18 @@ public final class ThaiBuddhistDate
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
/**
* Compares this date to another date, including the chronology.
* <p>
* Compares this {@code ThaiBuddhistDate} with another ensuring that the date is the same.
* <p>
* Only objects of type {@code ThaiBuddhistDate} are compared, other types return false.
* To compare the dates of two {@code TemporalAccessor} instances, including dates
* in two different chronologies, use {@link ChronoField#EPOCH_DAY} as a comparator.
*
* @param obj the object to check, null returns false
* @return true if this is equal to the other date
*/
@Override // override for performance @Override // override for performance
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
...@@ -452,6 +464,11 @@ public final class ThaiBuddhistDate ...@@ -452,6 +464,11 @@ public final class ThaiBuddhistDate
return false; return false;
} }
/**
* A hash code for this date.
*
* @return a suitable hash code based only on the Chronology and the date
*/
@Override // override for performance @Override // override for performance
public int hashCode() { public int hashCode() {
return getChronology().getId().hashCode() ^ isoDate.hashCode(); return getChronology().getId().hashCode() ^ isoDate.hashCode();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册