EnumSet als (bitmaskierter) Int

Hallo,

ich stosse mit meinen anfänglichen Kenntnissen gerade auf ein Problem.

Ich habe in meiner Applikation eine Enumeration (Zustände) für ein bestimmtes Objekt.
Dieses Objekt kann gleichzeitig mehrere Zustände haben - diesbezüglich erstelle ich mir ein EnumSet und speichere in diesem die Zustände bzw. die einzelnen enums.

Dieses EnumSet muss ich mir anschliessend als Int in einer (SQLite) Datenbank speichern, um es dann irgendwann an einen WCF Service im JSON Format zu senden.

Wie komme ich jetzt (am einfachsten) an den bitmaskierten Int-Wert meines EnumSet?

Auf der Gegenseite kann der Int-Wert wieder demaskiert werden bzw. erhält man die daraus resultierenden Zustände.

Grüße & Danke im Voraus
 
Ich sehe die eigentliche Frage nicht. Das einzige Fragezeichen hast du selber beantwortet, oder?

sorry, deshalb habe ich meine Frage auch im Newbie Bereich gestellt bzw. sehe ich die Antwort auf meine Frage leider noch nicht. Vielleicht sehe ich den Wald vor lauter.....oder ich habe auf dem Weg zur Antwort noch "ein paar" Wissenslücken ;( - wie auch immer:

ein Beispiel:

Code:
public enum Styles {
    BOLD, ITALIC, UNDERLINE, STRIKETHROUGH
}

final EnumSet<Styles> styles = EnumSet.noneOf(Styles.class);
styles.addAll(EnumSet.range(Styles.BOLD, Styles.STRIKETHROUGH));

Bitweise betrachtet hat "styles" den Wert 15 - mir ist aber nicht klar wie ich dieses Ergebnis elegant aus meinem EnumSet ziehen kann. Ich könnte durchs EnumSet iterieren und gelange somit an die einzelnen Ordinal Werte. Diese nun irgendwie bitweise verschieben?

Danke & Grüße
 

Noctarius

Top Contributor
Sehe ich das richtig, dass du nur alle Enum-Werte im Set haben willst?
Irgendwie glaube ich, habe ich die Frage immer noch nicht richtig verstanden
 
Sehe ich das richtig, dass du nur alle Enum-Werte im Set haben willst?
Irgendwie glaube ich, habe ich die Frage immer noch nicht richtig verstanden

nein, das ist nur ein Beispiel....bzw. habe ich eine Enumeration von Zuständen:

public enum Styles {
ZUSTAND1, ZUSTAND2, ZUSTAND3, ZUSTAND4
}

Mein Set kann eine beliebige Anzahl davon beinhalten....bzw.
kann das Objekt den
Zustand1 und Zustand4 haben (=9),
Zustand2 und Zustand3 haben (=5),
oder alle usw.

Und eben diesen "Inhalt" muss ich als Int-Wert in die Datenbank schreiben...
 
G

Gast2

Gast
Du könntest den einzelnen Zustandsinstanzen einen Wert geben. Diese dann miteinander verknüpfen und das Resultat als INT speichern.

Gibt es schon eine Vorgabe wie der int aussehen muss?
 
nein es gibt keine Vorgabe bzw. richtet sich das nach mir.
Stimmt, ich könnte den einzelnen Zuständen direkt einen Wert mitgeben:

Zustand1 = 1
Zustand2 = 2
Zustand3 = 4
Zustand4 = 8

und am Ende meiner Prüfung durchs EnumSet iterieren und die einzelnen Werte addieren bzw. das Ergebnis als Int speichern.

Wäre das eine saubere Lösung? bzw. ging ich davon aus das es eleganter zu lösen ist. In C# lassen sich diese enum Flags einfach abbilden.

Gerade gefunden:

java - Storing EnumSet in a database? - Stack Overflow

Geht genau in meine Richtung - eventuell hat sich dieser Threadstarter etwas "erfahrener" ausgedrückt ;)
 
G

Gast2

Gast
So könnte das dann aussehen:

Java:
    public enum State {
        STATE1(0x01),
        STATE2(0x02),
        STATE3(0x04),
        STATE4(0x08);
        
        private int value;
        
        private State(int value) {
            this.value = value;
        }
        
        public int getValue() {
            return value;
        }
    }
    
    public EnumSet<State> states;
    
    states.add(STATE1);
    states.add(STATE3);
    
    int dataBaseValue = 0;
    for (State state : states) {
        dataBaseValue = dataBaseValue | state.getValue();
    }
        
    //hier dann Wert in die Datenbank schreiben    
    //Zum auslesen dann per logischem && gucken ob der Wert maskiert wurde oder eben nicht.
 
perfekt - danke....

alternativ können die Bits auch direkt über das Ordinal verschoben werden:

Code:
public enum State {
        STATE1,
        STATE2,
        STATE3,
        STATE4;
     }
    
    public EnumSet<State> states;
    
    states.add(STATE1);
    states.add(STATE3);
    
    int dataBaseValue = 0;
    for (State state : states) {
            dataBaseValue |= 1 << state.ordinal();
    }

und wieder was gelernt...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben