Абстрактный класс Java - PullRequest
       29

Абстрактный класс Java

0 голосов
/ 16 октября 2018

Мне нужно написать абстрактный класс, который выглядит следующим образом.

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 голосов
/ 16 октября 2018

Могу ли я реализовать метод equals (), используя eq (), как это?

public boolean equals(Object o) {
    Value compare = (Value) o;
    return eq(compare);
}
0 голосов
/ 16 октября 2018

Метод hashCode() подходит (хотя я бы добавил аннотацию @Override, просто для упрощения поддержки кода и избежания ошибок), но equals(Object) определенно нет.

Следуя вашей логике, == не является правильным способом сравнения строк.Вместо этого вы должны использовать equals (см., Например, Как сравнить строки в Java? ).Кроме того, как отметил в комментариях Джоаким Даниэльсон, 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!
}
0 голосов
/ 16 октября 2018

Все компилируется и работает, но я понятия не имею, хороши ли моя функция hashcode () и equals ().

Ваш equals() должен сравнивать int val, а нерезультат toString() сравниваемых объектов (this.val == other.val).

Ваш hashCode() выглядит хорошо, хотя я бы добавил к нему @Override (то же самое с equals()).

Кроме того, я хочу использовать create () для создания объектовкак это: getInstance().create("1234");

Глядя на его реализацию, он выглядит хорошо (т.е. будет работать в соответствии с вашими потребностями):

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

хотя я не думаю, что вы на самом делехочу использовать его с getInstance().Достаточно будет просто Int.create():

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

Обратите внимание, что вам понадобится приватный конструктор.

Кроме того, как кто-то отметил в комментариях, рассмотрите возможность использования обобщений вместо наследования.

0 голосов
/ 16 октября 2018

Сначала, когда вы переопределяете методы, сделайте это с аннотацией @Override.Тогда я бы реализовал ваш метод равных по-другому.Просто верните this.val == other.val вместо того, чтобы делать this.toString () == other.toString ().Ваша реализация метода toString () в порядке.Ваш хэш-код тоже хорош.Но, пожалуйста, удалите этот метод создания.Вместо этого используйте конструктор.

...