Powiedzmy, że mam taką hierarchię klas:
abstract class Animal {...}
class Dog extends Animal{...} //ID = 1
class Cat extends Animal{...} //ID = 2
class Fish extends Animal{...} //ID = 200
Chcę zaimplementować funkcjonalność, która pozwoli mi zapisywać i odczytywać ciągi kolejnych obiektów dziedziczących z Animal do pliku binarnego, przy czym każda dziedzicząca klasa ma być reprezentowana przez unikalne ID.
Aby umożliwić sobie zapis tworzę więc w klasie Animal metodę public int getID()
i przeciążam ją w każdej klasie pochodnej, tak żeby zwracała unikalną wartość.
W jaki sposób mogę zaimplementować tę relację w drugą stronę? Chcę dla każdego ID odczytanego z pliku tworzyć instancję klasy o ID takim jak to odczytane. Na przykład gdy odczytam ciąg bajtów (1, 200, 2, 1) to powinienem dostać psa, rybę, kota i psa.
Próbowałem zrobić to tworząc klasę generyczną typu:
class Spawner <T extends Animal> {
public Class<T> endClass;
// ...
public T spawn() {
return endClass.newInstance();
}
}
Ale dla bardziej złożonych obiektów wygląda to o wiele gorzej, wymaga przepisywania sporych ilości kodu i jest totalnie niewygodne.