2017-08-27 66 views
-1

所以這是單元測試的一部分:爲什麼平等的方法是多餘的?

public class LocationTester { 

private Floor seventhFloor; 
private int size = 10; 

@Before 
public void setup() { 
    size = 10; 
    seventhFloor = new Floor(7, size); 
} 

@Test 
public void testLocationEquality() { 
    Location l1 = new Location(seventhFloor, 3, 3); 
    Location l2 = new Location(new Floor(7, size), 3, 3); 
    assertTrue(l1.equals(l2)); 
}} 

這裏的位置類的部分與equals方法:

class Location { 

private Floor floor; 
private int size, position; 

    @Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj == this) { 
     return true; 
    } 
    if (obj instanceof Location) { 
     return false; 
    } 
    return equals((Location) obj); 
} 

public boolean equals(Location loc) { 
    return floor.equals(loc.floor) && position == loc.position && size == loc.size; 
} 

而這裏的地板類的部分:

class Floor { 

private int number; 

    public boolean equals(Floor floor) { 
    return number == floor.number; 
} 

我不知道爲什麼在「位置l2 =新位置(新樓層(7,大小),3,3)」參數(Object obj)和類型轉換的等值方法被放在「新位置」時;實際上是位置本身的對象。爲什麼需要把equals(Object obj)。

測試運行正常,但沒有方法equals(Object obj)。

更何況,這個項目中沒有Location的子類。那麼爲什麼把類型轉換爲「返回等於((Location)obj)」;無論如何?

+3

爲什麼*什麼*返回true? 'equals(Object)','equals(Location)'或'equals(Floor)'?請澄清,理想情況下將其降低爲[mcve],以便爲缺乏清晰度提供更小的範圍。 –

+0

請注意,在這個例子中應該有一個編譯錯誤 - 位置的「equals(Location loc)」正在訪問對象的專用字段。 –

+3

@JanezKuhar Location中的方法被允許訪問Location的私有字段。 – khelwood

回答

1

您的測試實際上只測試equals(Location)方法。它不測試equals(Object)方法。

然而,equals(Object)存在於類以覆蓋一個從Object.equals(Object),這需要該參數是任何Object

如果在某些程序,您分配一個Location對象的Object變量:

Object a = new Location(...); 
Object b = new Location(...); 

然後使用a.equals(b),它不會使用該位置的平等的測試,並且將始終返回false,甚至如果這兩個實例指定了相同的位置 - 除非您有適當的方法 - 這是您在這裏所擁有的。

而在那個equals(Object)方法中,因爲它的參數類型爲Object,所以如果你沒有將它轉換爲Location,它會自動遞歸調用它自己。您必須將其轉換爲最終調用包含實際相等性測試的equals(Location)方法。

事實上,你可以沒有equals(Location),只是寫在equals(Object)測試,但我想筆者想保存在它是在編譯時知道案件三個測試步驟的測試對象是Location

+0

所以如果我有「Object o1 = new Location(sevenFloor,3,3);」在單元測試中,「return equals((Location)obj);」在equals(Object obj)裏面會達到目的嗎?因爲對象o1將被降級爲類型位置,我是對嗎? – Bob

+0

@Bob如果'l1'或'l2'是'Object'而不是'Location',那麼肯定會調用'equals(Object)'方法。您可以將打印添加到該方法並親自查看。 – RealSkeptic

+0

謝謝。現在我明白了和equals(Object obj)及其施法句的目的。儘管在我的情況下不需要,但這仍然是一個好習慣。 – Bob

相關問題