Om mijn programma te versnellen ben ik tegen hetvolgende probleem aangelopen..
Stel dat ik het volgende heb
Bij dit object is dus een inhoudelijke equals geimplementeerd, wat je in veel gevallen ook nodig hebt als je met bv collecties wilt werken. (Deze equals is zoals het door sun word voorgeschreven). In dit geval gaat het ook nog redelijk snel maar mijn objecten zijn een stuk gecompliceerder en een inhoudelijke vergelijking kan dus behoorlijk langzaam worden.
In mijn systeem kan het voorkomen dat ik dus meerdere instanties van hetzelfde object krijg en toch blijft het systeem correct functioneren. Om het geheel wat sneller te maken ga ik als ik een nieuw VoorbeeldObject heb gecreerd eerst kijken of er al een andere instantie gemaakt is. Als dat zo is dan maak ik daar gebruik van. Nu kan ik mijn equals vereenvoudigen tot:
Dit is natuurlijk een stuk sneller. Maar nu heb je dus die inhoudelijke vergelijking niet meer. De vraag is hoe ik dit nu correct kan oplossen. Want dit moet al lang een keer zijn uitgevonden.
probleem is dus dat ik soms inhoudelijke vergelijking wil en soms pointer vergelijking. (flag zetten heb ik ook al bedacht
)
Stel dat ik het volgende heb
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| VoorbeeldObject {
private int value;
public TestObject(int value){
this.value = value;
}
public boolean equals(Object item){
if(item == null)
return false;
if(item == this)
return true;
if(!(item instanceof VoorbeeldObject))
return false;
VoorbeeldObject anderVoorbeeldObject = (VoorbeeldObject)item;
return anderVoorbeeldObject.value == value;
}
public int hashCode(){
return value;
}
} |
Bij dit object is dus een inhoudelijke equals geimplementeerd, wat je in veel gevallen ook nodig hebt als je met bv collecties wilt werken. (Deze equals is zoals het door sun word voorgeschreven). In dit geval gaat het ook nog redelijk snel maar mijn objecten zijn een stuk gecompliceerder en een inhoudelijke vergelijking kan dus behoorlijk langzaam worden.
In mijn systeem kan het voorkomen dat ik dus meerdere instanties van hetzelfde object krijg en toch blijft het systeem correct functioneren. Om het geheel wat sneller te maken ga ik als ik een nieuw VoorbeeldObject heb gecreerd eerst kijken of er al een andere instantie gemaakt is. Als dat zo is dan maak ik daar gebruik van. Nu kan ik mijn equals vereenvoudigen tot:
code:
1
2
3
| public boolean equals(Object item){
return item == this;
} |
Dit is natuurlijk een stuk sneller. Maar nu heb je dus die inhoudelijke vergelijking niet meer. De vraag is hoe ik dit nu correct kan oplossen. Want dit moet al lang een keer zijn uitgevonden.
probleem is dus dat ik soms inhoudelijke vergelijking wil en soms pointer vergelijking. (flag zetten heb ik ook al bedacht