Java抽象类

时间:2018-10-16 19:51:23

标签: java class equals abstract hashcode

我需要写一个类似下面的抽象类。

public abstract class Value {

public abstract String toString();
public abstract Value add(Value v);
public abstract Value sub(Value v);
public abstract boolean eq(Value v);
public abstract boolean lte(Value v);
public abstract boolean gte(Value v);
public abstract boolean neq(Value v);
public abstract boolean equals(Object other);
public abstract int hashCode();
public abstract Value create(String s);

}

现在,我需要做一些继承自该类的类。我从Int类开始,并按如下方式实现它:

public class Int extends Value {

int val;

public String toString() {
    String toStr = Integer.toString(val);
    return toStr;
}

public Int add(Value v) {
    Int result = new Int();
   if(v instanceof Int) {
        Int temp = (Int) v;
        result.val = val + temp.val;
    }

    return result;
}

public Int sub(Value v) {
    Int result = new Int();
    if(v instanceof Int) {
        Int temp = (Int) v;
        result.val = val - temp.val;
    }
    return result;
}

public boolean eq(Value o) {
    if(this == o) return true;
    if(this == null) return false;
    if(getClass() != o.getClass()) return false;
    Int other = (Int) o;
    return toString() == other.toString();
}

public boolean lte(Value v) {
    if(v instanceof Int) {
        Int temp = (Int) v;
        return this.val < temp.val;
    }
    return false;
}

public boolean gte(Value v) {
    if(v instanceof Int) { 
        Int temp = (Int) v;
        return this.val > temp.val;
    }
    return false;
}

public boolean neq(Value v) {
    if(v instanceof Int) {
        Int temp = (Int) v;
        return !eq(temp);
    }
    return true;
}

public boolean equals(Object o) {
    if(this == o) return true;
    if(this == null) return false;
    if(getClass() != o.getClass()) return false;
    Int other = (Int) o;
    return toString() == other.toString();
}

public int hashCode() {
    Integer hash = val;
    return hash.hashCode();
}

public Int create(String s) {
    val = Integer.parseInt(s);
    return this;
}

}

一切都在编译和运行中,但是我不知道我的hashcode()函数和equals()是否良好。此外,我想使用create()制作这样的对象:

getInstance().create("1234");

我的方法还足够吗?

4 个答案:

答案 0 :(得分:1)

hashCode()方法很好(尽管我会添加一个@Override注释,只是为了使代码更易于维护并避免错误),但是equals(Object)绝对不是

按照您已有的逻辑,==不是比较字符串的正确方法。您应该改用equals(例如,参见How do I compare strings in Java?)。此外,正如Joakim Danielson在评论中指出的那样,this永远不会是null-您应该检查o是否是null

public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null) {
        return false;
    }
    if(getClass() != o.getClass()) {
        return false;
    }
    Int other = (Int) o;
    return toString().equals(other.toString()); // Here!
}

但公平地说,没有理由使用toString-您可以比较内部val

public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null) {
        return false;
    }
    if(getClass() != o.getClass()) {
        return false;
    }
    Int other = (Int) o;
    return val ==  other.val; // Here!
}

答案 1 :(得分:1)

  

一切都在编译和运行中,但是我不知道我的hashcode()函数和equals()是否良好。

您的equals()应该比较int val,而不是比较对象(toString()的{​​{1}}的结果。

您的this.val == other.val看起来不错,尽管我会添加hashCode()(与@Override相同)。

  

此外,我想使用create()制作如下对象:equals()

看看它的实现,它看起来不错(即可以根据您的需要工作):

getInstance().create("1234");

尽管我不认为您真的想将其与public Int create(String s) { val = Integer.parseInt(s); return this; } 一起使用。只需getInstance()就足够了:

Int.create()

请注意,您将需要一个私有构造函数。

此外,正如评论中提到的那样,请考虑使用泛型而不是继承。

答案 2 :(得分:0)

首先,当您重写方法时,请使用@Override Annotation进行操作。然后,我将以另一种方式实现您的equals方法。只是返回this.val == other.val而不是执行this.toString()== other.toString()。您的toString()方法实现可以。您的hashCode也很好。但是,请删除该创建方法。改用构造函数。

答案 3 :(得分:0)

我可以像这样使用eq()实现equals()方法吗?

public boolean equals(Object o) {
    Value compare = (Value) o;
    return eq(compare);
}