Jag förslår en patch som innebär att vi tar bort (den något skumma)
"rekursiva" typningen av Entity, dvs T i:
public interface Entity<T, ID> { }
Nackdelen med patchen är att sameAs implementationen i AbstractEntity
får en svagare typning. Fördelen är att det nu går att bygga APIer
baserade på interface (som sen implementeras i konkreta klasser för
entiteter och repositories). Det är idag inte möjligt (i alla fall har
inte jag kunna klura ut nåt sätt) på grund av ovanstående
konstruktion.
Den fulla patchen finns på ärendet:
http://code.google.com/p/oppna-program-dao-framework/issues/detail?id=2
Okej att committa?
/niklas
Håller i övrigt med om problemet med sameAs, ser dock inte att det
skulle vara svårt att lösa i implementationen (liknande hur man
vanligtvis gör i equals implementationer).
/niklas
2010/11/25 Anders Asplund <aasp...@gmail.com>:
Har labbat med liknande, men inte så imponerad av att hela APIet blir
fullt med denna typ av konstruktioner:
Vehicle<T extends Vehicle<T>>
Känns som att Entity APIet ger ett allt för stort avtryck.
/niklas
Var nog lite otydlig, mitt problem är inte antalet tecken (även om det
inte precis är snyggt heller) utan i att T får avtryck överallt där
Vehicle används, eller missuppfattar jag nånting? Tex:
public interface SomeStuff {
void foo(Vehicle<?> vehicle);
}
> Om man vill kan man även dölja Entity genom följande osnygga
> konstruktion:
> AbstractVehicle<T extends Entity<T, UUID>> extends AbstractEntity<T,
> UUID> implements Vehicle<T>
>
> Vilket skulle ge:
> Car extends AbstractVehicle<Car>
Inte säker på att jag alls förstår detta, dock är jag inte intresserad
av klasserna, jag vill ha ett vettigt API på interface nivå.
Om man vänder på frågan: givet att man såklart kan göra en typkoll i
sameAs, vad är fördelen med nuvarande konstruktion?
/niklas
Om man vänder på frågan: givet att man såklart kan göra en typkoll i
sameAs, vad är fördelen med nuvarande konstruktion?
Inte säker på att det ger oss så mycket, är det inte bara något åt
detta håll vi är ute efter?
public final boolean sameAs(final Entity<ID> other) {
return other != null && other.getClass().equals(getClass()) &&
this.getId().equals(other.getId());
}
> I övrigt så har mina förlag varit svar på problemet att det inte går att
> "bygga APIer baserade på interface" med dagens konstruktion av dao-fwk. Hur
> vida de blir snygga eller ej är en annan fråga.
Jag borde nog varit tydligare med min frågeställning: jag vill kunna
bygga APIer på interface nivå, utan att få en massa avtryck överallt
för att jag valt att använda dao fwk.
/niklas
Om man tänker sig följande arvshierarkier:
* Entity->Person->Student
* Entity->Vehicle
1. Nuläge
student.sameAs(person) == true:
2. Med patchen utan förändring i sameAs:
vehicle.sameAs(student) == true
3. Med path + ovan nämnda sameAs:
ger endast true om samma type.
Ettan är optimalt om vi kunde få till. Går inte detta så skulle jag nog föredra tvåan då sannolikheten att två entiteter från olika arvshierarkier har samma id får anses minimal. (Om man nu överhuvudtaget skulle få för sig att jämföra fordon och student ;) )
//Anders
Ska man i 1 även kunna göra komplementet?
person.sameAs(student) == true
Om ja:
public final boolean sameAs(final Entity<ID> other) {
return other != null
&& (other.getClass().isAssignableFrom(this.getClass()) ||
this.getClass().isAssignableFrom(other.getClass()))
&& this.getId().equals(other.getId());
}
Om nej:
public final boolean sameAs(final Entity<ID> other) {
return other != null &&
other.getClass().isAssignableFrom(this.getClass()) &&
this.getId().equals(other.getId());
}
/niklas
/niklas
2010/11/26 Niklas Gustavsson <nik...@protocol7.com>:
Kanon Niklas!
Ska försöka fixa lite i morgon med men livet har kommit emellan ett par dagar nu. :)