Dwukierunkowa relacja ID - klasa

0

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.

0

Temat nazywa się "serializacja" i "deserializacja".

Serializujesz do Stringa, kodujesz do binarki, dekodujesz binarkę, deserializujesz.

0

Nie rozumiem po co mi tutaj serializacja. Stworzyłem własny format binarny i nie znalazłem sensownego sposobu na utworzenie instancji klasy mając tylko ID tej klasy. Szukam teraz jakiejś funkcjonalności zbliżonej do hashmapy w której kluczami byłyby id, a wartościami jakieś twory reprezentujące konkretną klasę i pozwalające na stworzenie obiektu tej klasy.

Jeśli nic takiego nie istnieje to obuduje jakoś te Spawnery w object factory i będę się z nimi męczył.

0
caer napisał(a):

http://stackoverflow.com/questions/9886266/is-there-a-way-to-instantiate-a-class-by-name-in-java

Chodzi Ci o coś takiego?

Tak, na pewno się przyda jeśli nie znajdę wygodniejszego rozwiązania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1