Hi,
The hashCode method generator most likely didn't get updated to use the
Objects.* utility and does the computation "by hand".
I think this came up on slack before and it would be nice if it could be
updated to use Objects.hash(...) but nobody got to it so far.
JDK uses a "n = 31*n + obj.hashCode()" loop, NB does the same, just with a
different prime / start offset and unrolls the loop.
regarding equals: Double.compare() would use Double.doubleToLongBits()
internally and might be easier to read - something
NB could change too but its probably not that important.
best regards,
michael
On 11/5/25 22:20, Kenneth Fogel wrote:
> For a discussion for Java Beans in my writing, I generated the hashCode and
> equals methods in NetBeans. I then generated the same methods with Eclipse
> and Intellij. It is the hashCode and equals methods that stood out as
> Eclipse and Intellij generate the exact same code that is quite different
> from NetBeans.
>
> NetBeans:
> @Override
> public int hashCode() {
> int hash = 3;
> hash = 97 * hash + Objects.hashCode(this.title);
> hash = 97 * hash + Objects.hashCode(this.author);
> hash = 97 * hash + Objects.hashCode(this.publisher);
> hash = 97 * hash + Objects.hashCode(this.isbn);
> hash = 97 * hash + this.pages;
> hash = 97 * hash + this.copiesInStock;
> hash = 97 * hash + this.copiesSold;
> hash = 97 * hash + (int) (Double.doubleToLongBits(this.wholesaleCost)
> ^ (Double.doubleToLongBits(this.wholesaleCost) >>> 32));
> hash = 97 * hash + (int) (Double.doubleToLongBits(this.retailPrice) ^
> (Double.doubleToLongBits(this.retailPrice) >>> 32));
> hash = 97 * hash + (this.suitableForChildren ? 1 : 0);
> return hash;
> }
>
> Eclipse and IntelliJ:
> @Override
> public int hashCode() {
> return Objects.hash(title, author, publisher, isbn, pages,
> copiesInStock, copiesSold, wholesaleCost, retailPrice, suitableForChildren);
> }
>
> In NetBeans, why is the initial hash value 3 and then 97 that is always
> added? Is the fact that 97 + 3 = 100 significant? From the perspective of
> explaining what this code does, the Eclipse/IntelliJ version is much simpler
> to describe.
>
> Is there a reason for the additional code in the NetBeans version. Is the
> NetBeans version less prone to false positives, meaning you need to use
> equals() less often?
>
> For the equals() method the difference is also interesting.
>
> NetBeans
> @Override
> public boolean equals(Object obj) {
> if (this == obj) {
> return true;
> }
> if (obj == null) {
> return false;
> }
> if (getClass() != obj.getClass()) {
> return false;
> }
> final BookBean other = (BookBean) obj;
> if (this.pages != other.pages) {
> return false;
> }
> if (this.copiesInStock != other.copiesInStock) {
> return false;
> }
> if (this.copiesSold != other.copiesSold) {
> return false;
> }
> if (Double.doubleToLongBits(this.wholesaleCost) !=
> Double.doubleToLongBits(other.wholesaleCost)) {
> return false;
> }
> if (Double.doubleToLongBits(this.retailPrice) !=
> Double.doubleToLongBits(other.retailPrice)) {
> return false;
> }
> if (this.suitableForChildren != other.suitableForChildren) {
> return false;
> }
> if (!Objects.equals(this.title, other.title)) {
> return false;
> }
> if (!Objects.equals(this.author, other.author)) {
> return false;
> }
> if (!Objects.equals(this.publisher, other.publisher)) {
> return false;
> }
> return Objects.equals(this.isbn, other.isbn);
> }
>
> Eclipse and IntelliJ
> @Override
> public boolean equals(Object o) {
> if (o == null || getClass() != o.getClass()) return false;
> BookBean bookBean = (BookBean) o;
> return pages == bookBean.pages && copiesInStock ==
> bookBean.copiesInStock && copiesSold == bookBean.copiesSold &&
> Double.compare(wholesaleCost, bookBean.wholesaleCost) == 0 &&
> Double.compare(retailPrice, bookBean.retailPrice) == 0 && suitableForChildren
> == bookBean.suitableForChildren && Objects.equals(title, bookBean.title) &&
> Objects.equals(author, bookBean.author) && Objects.equals(publisher,
> bookBean.publisher) && Objects.equals(isbn, bookBean.isbn);
> }
>
> In this code Eclipse and IntelliJ use Double.compare for comparing fields
> that are doubles while NetBeans uses Double.doubleToLongBits.
>
> Is this even something to worry about? I am not advocating for this code to
> be the same in all three IDEs. I would like to know if the differences are
> significant. From what I see and from my limited understanding about how this
> code performs, I’d guess the IntelliJ/Eclipse code is superior.
>
> Ken
>
>
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists