(Down-)Casting Problem

temi

Top Contributor
Hallo zusammen, folgendes Problem:
Ich experimentiere gerade in Richtung "Entity Component System", dabei soll gelten, dass ein Entity nur eine ID ist und sonst nichts. In meinem Fall ist es eine UUID. Um den internen Typen der ID zu abstrahieren, habe ich eine Klasse "Entity" erstellt:
Java:
public class Entity
{
    private final UUID id;

    public Entity(final UUID id)
    {
        Objects.requireNonNull(id);

        this.id = id;
    }

    @Override
    public boolean equals(Object o)
    {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Entity entity = (Entity) o;

        return id.equals(entity.id);
    }

    @Override
    public int hashCode()
    {
        return id.hashCode();
    }
}

Da alle Spiel-Objekte "Entities" sind kann es z.B. für ein Inventory zu solchem Code kommen:
Java:
Map<Entity, List<Entity>> inventoryForPlayer;

Das ist etwas undurchsichtig, darum hatte ich so etwas vor, hier exemplarisch für "Player":
Java:
public final class Player extends Entity
{
    public Player(final UUID id)
    {
        super(id);
    }
}

Eigentlich ist das nur ein anderer Name für den selben Inhalt. Schade das es in Java kein using Player = Entity; gibt, wie bei C++.

Damit würde das Beispiel von oben zu folgendem:
Java:
Map<Player, List<Item>> inventoryForPlayer;


Entities sollen von einem EntityManager erzeugt und verwaltet werden (hier noch sehr rudimentär) und hier kommt nun das Problem. Der EntityManager soll natürlich ein Objekt vom benötigten Entity-Typen erzeugen und nicht ein allgemeines Entity:
Java:
public final class EntityManager
{
    public <T extends Entity> T createEntity()
    {
        final T entity = (T) new Entity(UUID.randomUUID());

        return entity;
    }
}

Der Cast schlägt allerdings fehl, vermutlich weil es ein Downcast zur Childklasse ist.

Lässt sich das Problem irgendwie lösen?
 
Zuletzt bearbeitet:

temi

Top Contributor
Ok, ich habe eine funktionierende Lösung gefunden:
Java:
public final class EntityManager
{
    public <T extends Entity> T createEntity(Class<T> clazz)
    {
        try
        {
            final T entity = clazz.getDeclaredConstructor(UUID.class).newInstance(UUID.randomUUID());
            return entity;
        }
        catch (ReflectiveOperationException e)
        {
            System.err.println(e);
        }

        return null;
    }
}

Leider ist ein zusätzlicher Parameter für den Aufruf erforderlich, aber das sollte zu verschmerzen sein. Ich werde sehen, ob ich so weiter machen kann...
 

looparda

Top Contributor
Könntest du das reflection-Gedöns nicht mit einer static-Method in der Entity-Klasse vermeiden?
Java:
public static Entity create() {
    return new Entity(UUID.randomUUID());
}
 

temi

Top Contributor
Könntest du das reflection-Gedöns nicht mit einer static-Method in der Entity-Klasse vermeiden?
Java:
public static Entity create() {
    return new Entity(UUID.randomUUID());
}
Nicht in der Entity-Klasse, denn dann würde ja nur der Basistyp erzeugt, aber mit einer statischen Methode in jeder abgeleiteten Klasse. Hm...

Was würde mir das bringen? Sicherheit? Geschwindigkeit?

Ernst gemeinte Fragen. Danke für den Vorschlag.
 

mrBrown

Super-Moderator
Mitarbeiter
Um den Class-Parameter wirst du nicht drum rum kommen, wenn du alle mit dieser Methode erzeugen willst.

Anderer Weg wäre, das es für jeden Typ eine Factory gibt und diese sich beim Manager registrieren, dann braucht man keine Reflection mehr.
 

temi

Top Contributor
Anderer Weg wäre, das es für jeden Typ eine Factory gibt und diese sich beim Manager registrieren, dann braucht man keine Reflection mehr.
Ich werde mir die Möglichkeit mal im Hinterkopf behalten, es aber jetzt erst mal so lassen wie es ist. Danke für die Idee.

Aktuell bin ich noch nicht so sicher, ob mir die spezialisierten Entity-Klassen, die es ja "nur" für die Lesbarkeit gibt, nicht an anderer Stelle zusätzliche Probleme machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Unsympath OOP Up- und Down-Casting Java Basics - Anfänger-Themen 3
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 4
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 0
M FTP Down-/Upload Java Basics - Anfänger-Themen 3
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
S Java und HTML- Drop Down- Mehrfachauswahl Java Basics - Anfänger-Themen 3
E Adobe Designer Drop Down Feld & If Abfrage Java Basics - Anfänger-Themen 4
M statt drop down menü - buttons Java Basics - Anfänger-Themen 5
C Casting Java Basics - Anfänger-Themen 8
F Interface Casting Java Basics - Anfänger-Themen 13
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
X Datentypen Casting?! Java Basics - Anfänger-Themen 7
P Casting Warning bei Iterator Java Basics - Anfänger-Themen 32
H Datentypen Casting objects Java Basics - Anfänger-Themen 29
S Class Casting Allgemein Java Basics - Anfänger-Themen 3
R Casting Problem Java Basics - Anfänger-Themen 15
D Arry Casting Java Basics - Anfänger-Themen 30
B Anfängerprobleme (Casting,...) Java Basics - Anfänger-Themen 5
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
D OOP casting/get & set Methoden Java Basics - Anfänger-Themen 7
J Type-Casting Java Basics - Anfänger-Themen 8
G Überschreiben von Methoden beim Casting Java Basics - Anfänger-Themen 7
T Casting von Objekten Java Basics - Anfänger-Themen 2
G Casting, Ordinalzahl eines Buchstabens? Java Basics - Anfänger-Themen 4
P Casting von Object zu (String || Integer) Java Basics - Anfänger-Themen 8
B Casting variabel gestalten. Java Basics - Anfänger-Themen 9
U casting: ArrayList to String[] Java Basics - Anfänger-Themen 10
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben