Objekt Typ zur Laufzeit ermitteln

Leon_2001

Aktives Mitglied
Hallo,

ich habe ein , wie ich dachte, relativ einfaches Problem.

Ich habe ein Array vom Typ einer abstrakten Oberklasse. Dort ist maximal ein Element jeder Subklasse speichern ... Ich möchte eine Methode schreiben, durch welche man den Klassennamen übergeben kann und dann das ensprechende Objekt von dieser Klasse zurückbekommt mit dem richtigem Typ.

Java:
    private HashMap<Entity, ArrayList<EntityComponent>> entities;   

@SuppressWarnings("unchecked")
  public <T extends EntityComponent> T getComponent(Entity entity, Class<T> type) {
        for(EntityComponent component: this.entities.get(entity)) {
            if(component.getClass() == type)
                return (T)component;
        }
        return null;
    }


Java:
private HashMap<Entity,ArrayList<EntityComponent>> entities;

  public <T extends EntityComponent> T getComponent(Entity entity, Class<T> type) {
        for(EntityComponent component: this.entities.get(entity)) {
            if(component.getClass() == type)
                return type.cast(component);
        }
        return null;
    }

Das sind zwei Möglichkeiten, die mir so eingefallen sind. Beide sehen mir aber nicht nach super Programmierstil aus, sondern eher nach einer Zwischenlösung. Darüber hinaus, wird mein Spiel dadurch enorm verlangsamt. Es ist dann plötzlich in Zeitlupe ... ich kann mir aber nicht vorstellen, dass es davon kommt oO

Die Methode hat man vorher so aufgerufen:

PositionComponent position = (PositionComponent) manager.getComponent(entity, PositionComponent.class);

Mit der Änderung so:

PositionComponent position = manager.getComponent(entity, PositionComponent.class);
 
Das ist eine ArrayList, kein Array.

Das sind zwei Möglichkeiten, die mir so eingefallen sind. Beide sehen mir aber nicht nach super Programmierstil aus, sondern eher nach einer Zwischenlösung. Darüber hinaus, wird mein Spiel dadurch enorm verlangsamt. Es ist dann plötzlich in Zeitlupe ... ich kann mir aber nicht vorstellen, dass es davon kommt oO
Beide Varianten sind möglich, wirklich schöner kann man das nicht lösen, wenn man so low-levelig arbeiten muss (zumindest fällt mir grad nichts schöneres ein...)


Wirklich langsamer als deine alte Lösung sollte das nicht sein. Du kannst aber einfach mal nen Profiler benutzen, um zu prüfen was langsam ist.

Je nach Verwendung kann man die innere Liste durch eine Map von Klasse->Objekt oder Klassenname->Objekt ersetzen, ich gehe aber mal nicht von extrem großen Listen aus?
 

Zurück
Oben