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の汎用ペアの逆方法
のサイドロー '(obj instanceof DefaultPair)'にはinbuild 'null'チェックがあるため、以前のヌルチェックは不要です。 – SomeJavaGuy
'reverseFirst'と' reverseSecond'フィールドを削除します。 –
また、セッターメソッドがないので、 'final'と' second'フィールドから 'final'修飾子を削除することもできます。 – SomeJavaGuy