Tumbleweed
Captain
- Registriert
- März 2008
- Beiträge
- 3.600
Bei meinem aktuellen Projekt bin ich auf die Frage gestoßen, ob ich ein oft verwendetes und sich ständig veränderndes Objekt mutable oder immutable gestallten sollte. Und zwar handelt es sich konkret um ein Objekt, das ich Vector2D getauft habe und welches hauptsächlich X- und Y-Koordinaten und ein paar Vektorfunktionen wie dot product und Normalisieren enthält.
Ich habe es erst einmal mutable gestaltet, d.h. x und y können von außen beschrieben werden. Damit habe ich mir allerdings auch schon erste Bugs eingefangen. Ich habe mir z.B. eine Reihe von Konstanten angelegt wie

Die einfache Lösung war ein copy constructor und die Erzeugung eines neuen Vector2D-Objekts, bei erster Übergabe.
Nun bin ich aber am überlegen, ob der Performancegewinn der wegfallenden ständigen Objekterzeugung diese Fehleranfälligkeit rechtfertigt. In Effective Java wird ja z.B. geraten so viel wie möglich immutable zu halten, aus verschiedenen Gründen. Ich frage mich aber, wann wäre so ein Punkt erreicht, wo es wirklich kritisch wird für die Performance. So ein Vector2D-Objekt ist winzig klein und daher überlege ich, es nun doch immutable zu machen und dann eben ständig (also hunderte bis tausende Male pro (game-loop) tick) neu zu erzeugen.
Bin gespannt auf Meinungen dazu. Mal wieder so eine typische good-practice Frage von mir.
Ich habe es erst einmal mutable gestaltet, d.h. x und y können von außen beschrieben werden. Damit habe ich mir allerdings auch schon erste Bugs eingefangen. Ich habe mir z.B. eine Reihe von Konstanten angelegt wie
um leichter Richtungsangaben formulieren zu können. Nun war ich so clever einfach irgendwo im Programm einem Objekt genau so eine Konstante zu übergeben und habe dabei nicht bedacht, dass die darin enthaltenen Attribute natürlich nicht automatisch auch konstant sind. Den Rest kann man sich denkenpublic static final Vector2D ZERO = new Vector2D(0, 0);
public static final Vector2D WEST = new Vector2D(-1, 0);
public static final Vector2D EAST = new Vector2D(1, 0);
public static final Vector2D NORTH = new Vector2D(0, -1);
public static final Vector2D SOUTH = new Vector2D(0, 1);
public static final Vector2D NORTH_EAST = new Vector2D(1, -1);
public static final Vector2D NORTH_WEST = new Vector2D(-1, -1);
public static final Vector2D SOUTH_EAST = new Vector2D(1, 1);
public static final Vector2D SOUTH_WEST = new Vector2D(-1, 1);
Die einfache Lösung war ein copy constructor und die Erzeugung eines neuen Vector2D-Objekts, bei erster Übergabe.
Nun bin ich aber am überlegen, ob der Performancegewinn der wegfallenden ständigen Objekterzeugung diese Fehleranfälligkeit rechtfertigt. In Effective Java wird ja z.B. geraten so viel wie möglich immutable zu halten, aus verschiedenen Gründen. Ich frage mich aber, wann wäre so ein Punkt erreicht, wo es wirklich kritisch wird für die Performance. So ein Vector2D-Objekt ist winzig klein und daher überlege ich, es nun doch immutable zu machen und dann eben ständig (also hunderte bis tausende Male pro (game-loop) tick) neu zu erzeugen.
Bin gespannt auf Meinungen dazu. Mal wieder so eine typische good-practice Frage von mir.