简体   繁体   中英

How do I implement Objects.hashcode within java 1.6

I have some code as such:

@Override
public int hashCode() {
    int hash = 5;
    hash = 47 * hash + Objects.hashCode(this.bendWidth);
    hash = 47 * hash + Objects.hashCode(this.bendSideLength);
    hash = 47 * hash + Objects.hashCode(this.thickness);
    hash = 47 * hash + Objects.hashCode(this.innerRadius);
    hash = 47 * hash + Objects.hashCode(this.bendAngle);
    hash = 47 * hash + Objects.hashCode(this.kfactor);
    hash = 47 * hash + Objects.hashCode(this.bendShortening);
    return hash;
}

and I'm looking to make this source work for 1.6

So far I've tried guava:

@Override
public int hashCode() {
    int hash = 5;


    Object[] objs = new Object[]{
        this.getPointND().getPoint()[0],
        this.getPointND().getPoint()[1],
        this.getPointND().getPoint()[2],
        this.getPointND().getPoint()[3],
        this.getPointND().getPoint()[4],
        this.kfactor,
        this.bendShortening
    };

    hash = 47 * hash + Objects.hashCode(objs);

    hash = 47 * hash + Objects.hashCode(this.bendWidth);
    hash = 47 * hash + Objects.hashCode(this.bendSideLength);
    hash = 47 * hash + Objects.hashCode(this.thickness);
    hash = 47 * hash + Objects.hashCode(this.innerRadius);
    hash = 47 * hash + Objects.hashCode(this.bendAngle);
    hash = 47 * hash + Objects.hashCode(this.kfactor);
    hash = 47 * hash + Objects.hashCode(this.bendShortening);
    return hash;
}

And I've tried a solution as so:

   @Override
    public int hashCode() {
        int hash = 5;


        Object[] objs = new Object[]{
            this.getPointND().getPoint()[0],
            this.getPointND().getPoint()[1],
            this.getPointND().getPoint()[2],
            this.getPointND().getPoint()[3],
            this.getPointND().getPoint()[4],
            this.kfactor,
            this.bendShortening
        };

        hash = 47 * hash + Objects.hashCode(objs);

        hash = 47 * hash + Objects.hashCode(this.bendWidth);
        hash = 47 * hash + Objects.hashCode(this.bendSideLength);
        hash = 47 * hash + Objects.hashCode(this.thickness);
        hash = 47 * hash + Objects.hashCode(this.innerRadius);
        hash = 47 * hash + Objects.hashCode(this.bendAngle);
        hash = 47 * hash + Objects.hashCode(this.kfactor);
        hash = 47 * hash + Objects.hashCode(this.bendShortening);
        return hash;
    }

But still this test returns fails:

@Test
public void testHashCodeIsDifferentHashCode() {
    try {
        DataPoint pointOne = new DataPoint();
        pointOne.setBendAngle(new Double(1));
        pointOne.setBendShortening(new Double(1));
        pointOne.setBendSideLength(1);
        pointOne.setBendWidth(1);
        pointOne.setInnerRadius(1);
        pointOne.setKfactor(new Double(1));
        pointOne.setThickness(1);

        DataPoint pointTwo = new DataPoint();
        pointTwo.setBendAngle(0);
        pointTwo.setBendShortening(new Double(0));
        pointTwo.setBendSideLength(0);
        pointTwo.setBendWidth(0);
        pointTwo.setInnerRadius(0);
        pointTwo.setKfactor(new Double(0));
        pointTwo.setThickness(0);

        DataPoint pointThree = new DataPoint();
        pointThree.setBendAngle(Double.NaN);
        pointThree.setBendShortening(Double.NaN);
        pointThree.setBendSideLength(Double.NaN);
        pointThree.setBendWidth(Double.NaN);
        pointThree.setInnerRadius(Double.NaN);
        pointThree.setKfactor(Double.NaN);
        pointThree.setThickness(Double.NaN);

        Set<DataPoint> map = new HashSet<DataPoint>();
        map.add(pointOne);
        map.add(pointTwo);
        assert (map.size() == 2);
    } catch (NullPointerException ex) {
        assert false : "failed due to null";
    } catch (Exception ex) {
        assert false : "failed, unknown error.";
    }
}

Have tried this:

@Override
public int hashCode() {
    int hash = 5;
    hash = 47 * hash + Objects.hashCode(this.bendWidth);
    hash = 47 * hash + Objects.hashCode(this.bendSideLength);
    hash = 47 * hash + Objects.hashCode(this.thickness);
    hash = 47 * hash + Objects.hashCode(this.innerRadius);
    hash = 47 * hash + Objects.hashCode(this.bendAngle);
    hash = 47 * hash + Objects.hashCode(this.kfactor);
    hash = 47 * hash + Objects.hashCode(this.bendShortening);
    return hash;
}
public class Objects {

    public static int hashCode(Object object) {
        return object == null ? 0 : object.hashCode();
    }
}

My equals solution is as so:

@Override
public boolean equals(Object obj) {
    if (obj instanceof DataPoint) {
        DataPoint od = (DataPoint) obj;
        return (this.bendAngle == od.bendAngle)
                && (this.bendShortening == od.bendShortening)
                && (this.bendSideLength == od.bendSideLength)
                && (this.bendWidth == od.bendWidth)
                && (this.innerRadius == od.innerRadius)
                && (this.kfactor == od.kfactor)
                && (this.thickness == od.thickness);
    }
    return false;
}

There's nothing in JDK 1.6, but it's utterly trivial to write it yourself:

public static int hashCode(Object object) {
    return object == null ? 0 : object.hashCode();
}

Or - preferrably, IMO - start using Guava which has a familiar-looking Objects class. (It's not quite the same, as it only has the version taking an array via varargs, but that just means you can write your method in a single call.)

I suspect that you'll find that if you look closely at Guava, there are a bunch of useful things in there which you'll start using - I know I wouldn't want to write any signficant amount of Java code these days without Guava or something very similar.

If this were a dependency just for Objects.hashCode I'd just implement that method myself, but I'm sure there are other things you'll find useful.

This is one option:

@Override
public int hashCode() {
    return Arrays.asList(this.bendWidth, this.x, this.y).hashCode();
}

Is null safe, and generates a good hash code. There is also an Objects class in quava:

com.google.common.base.Objects

The equals method was the problem. a new Double(0.0) == new Double(0.0) evaluates to false.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM