Использование логического объекта equals () в моем реализованном equals () - PullRequest
1 голос
/ 16 марта 2019

Итак, я делаю джунит-тест на Java.

Я должен испытать два конкретных типа

public class BoolValue implements Value{
   private boolean item; 

   //the Constructor 
   public BoolValue(boolean data){
        item = data;
   }

   //checks to see if the current object is of the same type as the parameter  
   public boolean equals(Value v){
       boolean result = false;
          if (v instanceof BoolValue) {
              if(this == v)
                  result = true; 
          }
       return result; //true if equal 
   }

    // returns current state string 
    public String toString(){
         return " "+item;

    }
 }

Это тестовый пример в моем тестовом файле

@Test
 public void testBoolean(){
     BoolValue value = new BoolValue(true); 
     BoolValue value2 = new BoolValue(true); 
     assertEquals(true, value.equals(value2));
 }

Возвращает ложь вместо ожидаемой истины

В методе equals я хочу сравнить два логических типа, но я не могу использовать java.object equals (), потому что программа читает его как класс equals (), поэтому он рекурсивный. Как мне вызвать java.object equals () для сравнения логических типов. Кроме того, я иду по этому пути

1 Ответ

4 голосов
/ 16 марта 2019
 if (v instanceof BoolValue) {
       if(this == v)
           result = true; 
 }

Вы не можете использовать ==, когда хотите new BoolValue(true).equals(new BoolValue(true)). Вам нужно сравнить две item внутри них.

Кроме того, вам нужно принять Object, чтобы получить «правильный» equals метод.

@Override
public boolean equals(Object v){
   return (v instanceof BoolValue && ((BoolValue)v).item == this.item);
}

И когда вы переопределяете equals, вам также нужно переопределить hashCode.

@Override
public int hashCode(){ return item ? 0 : 1; }

Наконец (если вы не собираетесь делать эти «значения» изменяемыми), поскольку существует только два возможных значения, вы должны сделать конструктор закрытым и вместо этого предоставить два значения в виде статических полей (вы также можете использовать enum) .

public class BoolValue implements Value {
   private final boolean item;
   private BoolValue(boolean v){
      this.item = v;
   }
   public static final BoolValue TRUE = new BoolValue(true);
   public static final BoolValue FALSE = new BoolValue(false);
   public static BoolValue valueOf(boolean x){
     return x ? TRUE : FALSE;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...