0

我有一个作业要为以下方法编写一个测试,以显示使用此方法创建的 Object 及其副本是相等的。

   /**
 * Creates a new object that is a duplicate of this instance of
 * Parameter.
 * <p>
 * The duplication is a "deep copy" in that all values contained in the
 * Parameter are themselves duplicated.
 * 
 * @return The new duplicate Parameter object.
 */
public Parameter copy( )
{
    Parameter result = new Parameter( );
    result.setName( getName( ) );
    for ( int index = 0; index < getNumberOfValues( ); index++ )
    {
        result.addValue( getValue( index ).copy( ) );
    }
    return result;
 }

我写了不同的方法,但每次结果都显示它们不相等。我的一项测试:

@Test
public void testCopy() {
    Parameter param = new Parameter();
    Value val1 = new Value();
    //val1.setName("Hi!");
    //param.addValue(val1);

    Parameter param2 = param.copy();
    Parameter expected = param;
    Parameter actual = param2;

    assertEquals(param, param2);
}

但似乎这种方法不会创建和精确复制参数。你能指导我吗?

这是值的复制方法:

   /**
 * Creates a new Value object that is a duplicate of this instance.
 * 
 * @return The new duplicate Value object.
 */
public Value copy( )
{
    Value newValue = new Value( );
    newValue.setName( getName( ) );
    return newValue;
}
4

2 回答 2

2

您的 Parameter 类需要一个 equals 方法()。没有这个 java 运行基于引用的相等性( Object.equals() 的默认行为),因此你的观察。

您的 equals 方法可能如下所示:

public boolean equals(Object o)
{
    Parameter p = (Parameter)o;
    return this.getName().equals(p.getNames) && this.getNumberOfValues() == p.getNumberOfValues() &&B this.values().equals(p.values());
}
于 2012-07-31T16:53:27.063 回答
0

类的 equals 方法Object在此处描述)清楚地表明,引用需要引用同一个对象才能返回 true。在您的情况下,复制方法正确地创建了一个新参数,然后创建了一个新值,以便创建复制对象。因此,现有equals()方法将始终返回 false。

为了正确测试,您需要按照注释中的说明进行操作,即创建一个新的 equals() 方法,该方法将覆盖 Object 类中现有的方法,包括 Parameter 类和 Value 类。您的方法应该测试每个对象的内容(每个对象中的名称)是否相同,或者根据您的应用程序您认为合适的任何其他语义。

于 2012-07-31T17:02:10.937 回答