2016-10-27 2 views
0
public class Main{ 

public static void main(String[] args) { 

    final Pair<Integer> p = new DefaultPair<>(3,5); 
    p.reverse(); 
    final Pair<Integer> q = new DefaultPair<>(5,3); 
    } 

} 

public interface Pair<F> { 
    F first(); 
    F second(); 
    F reverse(); 
} 

public class DefaultPair<F> implements Pair<F> { 
    private final F first; 
    private final F second; 
    private F reverseFirst; 
    private F reverseSecond; 


    public DefaultPair(F first, F second){//constructor 
    this.first = first; 
    this.second = second; 
    } 

// method that is not working  
@Override 
    public F reverse() { 

    this.reverseFirst = second; 
    this.reverseSecond = first; 

    System.out.println(this); 
    return (F)this; 
    } 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((first == null) ? 0 : first.hashCode()); 
    result = prime * result + ((second == null) ? 0 : second.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof DefaultPair)) 
     return false; 
    DefaultPair<F> other = (DefaultPair) obj; 
    if (first == null) { 
     if (other.first != null) 
      return false; 
    } else if (!first.equals(other.first)) 
     return false; 
    if (second == null) { 
     if (other.second != null) 
      return false; 
    } else if (!second.equals(other.second)) 
     return false; 
    return true; 
} 

@Override 
    public F first(){ 
     return first; 
    } 

@Override 
    public F second(){ 
     return second; 
    } 


@Override 
public String toString() { 
     return "<" + first + ", " + second + ">"; 
    } 

} 

import static org.junit.Assert.*; 

import org.junit.Test; 

public class TestDefaultPair { 

    @Test 
    public void test() { 
     final Pair<Integer> p = new DefaultPair<>(3, 5); 
     final Pair<Integer> q = new DefaultPair<>(5, 3); 
     assertEquals(3, p.first().intValue()); 
     assertEquals(5, p.second().intValue()); 
     assertEquals("<3, 5>", p.toString()); 
     assertTrue(p.equals(p)); 
     assertFalse(p.equals(q)); 
     assertFalse(q.equals(p)); 
     assertFalse(p.equals(null)); 
     assertTrue(p.equals(q.reverse()));//test that is not passing 
    } 

} 

Мне нужно, чтобы все тестовые кейсы проходили. Все они проходят, кроме последнего, где я должен вызвать обратный метод. Приемник обратного метода не должен быть мутирован. Например, я не должен переставлять p (3,5). Все остальное работает помимо обратного метода. Если я назову p.reverse(); и распечатать p, он печатает в первоначальном порядке.обратный метод для общей пары в java

+0

as a sidenote '(obj instanceof DefaultPair)' имеет inbuild 'null' check, поэтому предыдущая нулевая проверка не нужна. – SomeJavaGuy

+3

Удалите поля 'reverseFirst' и' reverseSecond'. –

+0

также вы можете удалить модификатор 'final' из ваших полей' first' и 'second', так как они логически не меняются, так как нет метода setter. – SomeJavaGuy

ответ

2

Выполнение equals() в тестах DefaultPair first и second значения полей для равенства. Но ваш метод reverse() изменяет только значения полей reverseFirst и reverseSecond.

Либо вы должны использовать reverseFirst и reverseSecond в equals() или изменить значения first и second в reverse()

+0

Также я бы рекомендовал удалить reverseFirst и reverseSecond, а также создать обратный вызов меток, чтобы вернуть новый экземпляр пары с первой и второй заменой – Wallkan

1

Я думаю, что это неправильно здесь: F reverse(), в вашей ситуации, F является целое, но целое не то, что есть вы должны вернуться, вы должны вернуть пару.

p.equals(q.reverse()) is like: pair.equals(Integer) 
1

Надеюсь, я не понимал, все правильно, но я думаю, что ваш обратный метод должен быть похож на это:

public DefaultPair<F> reverse() { 
    return new DefaultPair<F>(second,first); 
    // Here you should return a new instance of `DefaultPair<F>`, 
    // which uses second as first and first as second. 
    // Now you are left with an non mutable reversed new instance of DefaultPair 

} 

В конце концов, это было бы логично и сделать reverseFirst и reverseSecond бесполезен в своем классе, и как будто их нужно удалить.

+0

Я думаю, что это действительно привело меня в правильном направлении, но тест все еще не проходит. Когда я вызываю реверс и печатаю после этого, он все равно дает мне исходную пару. – ASS466uiuc

+0

@ ASS466uiuc, потому что вам нужно сохранить новый экземпляр, сгенерированный здесь, в переменную. Поскольку вы упомянули, что 'DefaultPair' не должен быть изменчивым, теперь он возвращает новый обратный экземпляр, который теперь должен быть другой. Попробуйте просто напечатать 'p.reverse()', и вы увидите, что новый экземпляр отличается от другого. – SomeJavaGuy

+0

System.out.println (q.reverse()); я сделал это, это была моя линия печати, но, кроме того, тест jUnit по-прежнему не проходит – ASS466uiuc

Смежные вопросы