Enumeration/Static Final/Bitfield

teremy

Mitglied
Hallo.

Bin zur Zeit dabei meinen Code etwas zu überarbeiten und da habe ich an vielen Stellen Integers verwendet, obwohl viel kleinere Zahlenbereiche auch reichen, daher verwende ich zum Teil sogar nur noch bytes. Ein anderer Punkt war, dass mir mal jemand sagte, dass Enumerations nicht so effizient sind. Immer wenn ich verschiedene Typen von irgendetwas habe, nehme ich meistens eine Enumeration. Ich habe z.B. für die Blickrichtung eines Spielers Folgendes:
Java:
public enum FacingDirection
{
UP, RIGHT, DOWN, LEFT
}
Der Player besitzt dann eben ein Attribut vom Typ FacingDirection.
Ich frage mich nur wie effizient das ist, also wie wird so eine Enumeration intern repräsentiert?
Letztendlich geht es mir ja nur darum, dass ich da ein Wort reinschreiben kann, was ich verstehe.
Daher hatte ich noch folgenden Ansatz:
Java:
public class FacingDirection
{
	public static final byte UP = 0;
	public static final byte RIGHT = 1;
	public static final byte DOWN = 2;
	public static final byte LEFT = 3;
}
Da ich später Kryonet zur Dateiübertragung nutze, würde mich mal interessieren was nun effizienter ist. Ein Attribut vom Typ FacingDirection oder ein Attribut vom Typ byte.
Selbst 1 Byte ist ja schon zuviel, im Prinzip würden 2 Bit ja auch reichen, sodass UP = 00, RIGHT = 01, DOWN = 01 und LEFT = 11 ist. Intern soll es eben möglichst effizient gemacht werden, mir gehts nur darum, dass ich dem Attribut des Spielers später nicht irgendeine komische Zahl zuweise, sondern dann eben FacingDirection.UP verwenden kann o.Ä... Kann ich ja auch so, nur was ist effizienter?

Des Weiteren habe ich gelesen, dass ein EnumSet intern als Bitvektor repräsentiert wird und es dadurch extrem kompakt und effizient ist ( EnumSet (Java Platform SE 7 ) ).
Macht es Sinn einen Bitvektor irgendwie mithilfe eines EnumSets zu repräsentieren ( was ja intern ohnehin ein Bitvektor ist )? Welche Größe besitzt der Bitvektor dann? Ansonsten würde ich eben eine Klasse Bitvector ( oder so ähnlich ) schreiben die als Attribut einen Integer hat ( ein Integer hat ja 32 Bit ), das wäre dann sozusagen mein Bitvektor, den ich dann mit den Shiftoperatoren und den Operatoren "Und" und "Oder" bearbeiten kann ( da würde ich mir natürlich schöne Methoden schreiben ).

Ich will eben die effizienteste Repräsentation für meine Daten finden, weil ich gerade dabei bin ein Spiel Netzwerkfähig zu machen und Kryonet erlaubt es mir ja ganz einfach Objekte zu senden.

Danke schonmal für eure Zeit!


Jan
 

teremy

Mitglied
Vielen Dank für die Antwort, das hat mir schonmal sehr geholfen!
Wenn ich es richtig verstanden habe, wird aus der Enumeration dann eine Klasse erstellt, die als Typ für die einzelnen Elemente der Enumeration genutzt wird ( also intern ).
Als Attribute hat die Klasse einen String ( der Name ) und einen Integer ( die Ordinalzahl ).
Somit müsste meine Variante mit den statischen Byte Konstanten eigentlich effizienter sein. Den Namen kann ich dann zwar nicht unbedingt nutzen, aber das brauche ich auch nicht.

Die EnumSet Geschichte muss ich mir auch nochmal anschauen, aber für meinen Bitvektor werde ich wohl eine eigene Klasse schreiben, die dann mit einem Integer Attribut intern arbeitet, sodass der Bitvektor 32 bit lang ist. Außerdem hab ich lange nicht mehr mit den Shiftoperatoren gearbeitet :).
 

Phash

Top Contributor
Von der Effizienz her macht es keinen Unterschied, da intern mit dem gleichen Konstrukt gearbeitet wird.

Du kannst es ja mal Profilen.

Enums haben einen handling Vorteil, dass war es aber schon
 

teremy

Mitglied
Mit Profilen hab ich mich noch nie beschäftigt, aber werde ich mir mal anschauen.
Die Sache ist, dass ich zur Zeit ein Spiel von mir onlinefähig machen will und für den Netzwerkkram nutze ich KryoNet, was es ja erlaubt Objekte zu verschicken. Grundsätzlich gehe ich davon aus, dass der Speicherplatz eines Objektes von seinen Attributen abhängig ist, daher möchte ich hier natürlich den kleinstmöglichen Dateitypen nutzen und die kleinstmögliche Anzahl an Attributen.
Intern wird bei der Enumeration ja auch noch ein String gespeichert, daher würde ich naiverweise sogar sagen, dass das Objekt später mehr Speicherplatz verbraucht, wenn ich es mit KryoNet verschicke.
Zudem verwende ich bei meinen static finals den primitiven byte Datentyp. Wenn die Enumeration intern einen int verwendet, dann wäre das ja definitiv mehr Speicherplatz. Vermutlich ist die Sache viel komplexer, da KryoNet ja auch noch komprimiert etc., aber vielleicht sollte ich mich dahingehend nochmal informieren, wie KryoNet die Objekte verschickt.
Danke für eure Antworten!
 
Zuletzt bearbeitet:

Barista

Top Contributor
Enums sind sicherer bezüglich Programmierfehlern.

Scheinbar ist Dir die Effizienz wichtiger als die Korrektheit.

Du kannst aber im Code ein sicheres Konstrukt verwenden und auf dem Übertragungsweg ein effizientes.
 

teremy

Mitglied
Du meinst sicher, weil ein byte auch Werte zulassen würde, für die ich gar nichts definiert habe?
Aber sehr gute Idee, ich kann natürlich eine Enumeration verwenden und wenn ich Daten übertragen will, einfach den entsprechenden Wert als byte übertragen und später aus dem byte wieder das Element der Enumeration machen. Das klingt sehr vernünftig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
T Spielkarten Enumeration in KartenDeck verwalten Allgemeine Java-Themen 7
M Enumeration Rückwärs durchlaufen Allgemeine Java-Themen 5
G JDK 1.5 und Enumeration Allgemeine Java-Themen 5
G Cast von String zu Enumeration Allgemeine Java-Themen 2
C Enumeration läuft von hinten durch Allgemeine Java-Themen 4
B Enumeration von sich wiederholenden Elementen Allgemeine Java-Themen 4
M Erstes Element einer Enumeration ermitteln Allgemeine Java-Themen 6
N Enumeration Allgemeine Java-Themen 12
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4
J Problem mit static/non-static Allgemeine Java-Themen 2
G getAppletContext() in static Methode Allgemeine Java-Themen 3
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
J Nicht-static variable in static variable kopieren - wie? Allgemeine Java-Themen 14
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
G static vor einem array Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
A JSP & static-Variablen Allgemeine Java-Themen 3
B Static Import: Syntaxfrage Allgemeine Java-Themen 2
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
Z auf static Methode aus anderen Package zugreifen? Allgemeine Java-Themen 7
N this im public static void Allgemeine Java-Themen 3
C Communication zwischen zwei Projekte - static objects Allgemeine Java-Themen 4
S static mit abstract und in interface Allgemeine Java-Themen 10
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
G final "spammen" + bedeutung Allgemeine Java-Themen 14
J Final Method Allgemeine Java-Themen 9
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben