enums in java



  • wie mache ich sowas richtig

    enum testenum
    {
    	test = 0x0101,
    }
    

    MfG



  • ich habe es jetzt mal so Probiert

    enum testenum
    {
        test(0x0101);
    
        private int value;
    
        private testenum(int value)
        {
            this.value = value;
        }
    }
    

    wenn ich das im Code jetzt benutze gibt der mir trotzdem 0

    byte[] b = new byte[2];
    
    b[0] = (byte)testenum.test.ordinal();
    b[1] = (byte)(testenum.test.ordinal()>>8);
    

    sind beide Werte von b 0

    woran könnte es liegen?



  • Was soll das sein? Enums sind enums, keine ints.



  • Du hast ordinal() nicht überschrieben (geht das überhaupt?) und wunderst Dich, dass es ganz normal funktioniert?



  • ich möchte genau das

    enum testenum 
    { 
        test = 0x0101, 
        test1 = 0x0102,
        ... usw
    }
    

    wie in C++ einem enum einen bestimmten Wert geben und diesen später auch verwenden.



  • so gehts:

    enum testenum
    {
        test(0x0101);
    
        private int value;
    
        private testenum(int value)
        {
            this.value = value;
        }
        public int Get()
        {
            return value;
        }
    }
    

    und dann

    byte[] b = new byte[2];
    
    b[0] = (byte)testenum.test.Get();
    b[1] = (byte)(testenum.test.Get()>>8);
    

    mal sehen ob jetzt auch der switch klappt



  • Was spricht gegen

    public class EnumTest {
    
      public static final int a = 0x01010
      public static final int b = 0x110A
    }
    

    Ansonsten wirst du hier fündig
    http://openbook.galileocomputing.de/javainsel8/javainsel_10_003.htm#ixecf14589b27619d4fced54ed3de59569



  • Achja, bei Bit-Operationen aufpassen! Hoffentlich sagt das dein 1200 Seiten Buch 😃

    In C++ gibt es den >> Operator
    In Java gibt es den >> und >>> Operator 😃



  • wie mache ich jetzt den umgekehrten Fall?

    byte a,b;
    short c;
    
    a = 1;
    b = 1;
    c = (short)a;
    c |= ((short)b)<<8;
    
    switch (c)
    {
    case testenum.test:
    
    break;
    }
    

    Er meldet jetzt. Type mismatch: cannot convert from testenum to short

    Wie geht das switch?



  • http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/enum.html

    Du musst den short zuvor mit einer geeigneten Methode in den enum-Typ zurückcasten. Enumerationen sind viel mächtiger in Java, sind nicht einfache Integer-Konstanten und sind dementsprechend zuvor zu casten.

    Bzw. anders gesagt: Woher soll das Programm wissen, dass du den private integer value im switch prüfen willst?

    Also entweder c zuvor ins Enum casten oder aus allen Konstanten den short rausholen (würde zu a) tendieren, da schöner).

    MfG SideWinder



  • wenn ich das so mache:

    enum testenum
    {
        test(0x0101);
        test1(0x8101);
    
        private int value;
    
        private testenum(int value)
        {
            this.value = value;
        }
        public int Get()
        {
            return value;
        }
        public void Set(short value)
        {
            this.value = value;
        }
    }
    

    mit dem aufruf:

    byte a,b;
    short c;
    testenum t = testenum.test;
    
    a = 1;
    b = 81;
    c = (short)a;
    c |= ((short)b)<<8;
    
    t.set(c)
    
    switch (t)
    {
    case test1:
    
    break;
    default:
    
    break;
    }
    

    landet der im switch nicht an der richtigen stelle. Obwohl ich im Debugger sehe das der Wert des enums korrekt ist

    Oder geht das anders mit dem Casten?

    MfG



  • public enum TestEnum // Hör endlich auf C++ zu programmieren
    {
        TEST_A(0x0101), // Beistrich, das Bsp von dir vorhin compilierte daher wahrscheinlich schonmal gar nicht...
        TEST_B(0x8101);
    
        private final int value; // Kein besonderer Status, ganz normale private Variable!
    
        private TestEnum (int value)
        {
            this.value = value;
        }
    
        public int getValue ()
        {
            return value;
        }
    }
    
    ...
    
    short c = 0x0101;
    
    // Nun müssen wir irgendwie das c in TestEnum umwandeln, da TestEnum.value keinen besonderen Status hat und dort beliebiges drin stehen könnte (Berechnungsergebnis, weiß der Teufel was) werden wir um eine Utility-Methode nicht rumkommen:
    
    TestEnum valueToTestEnum (short c)
    {
        for(TestEnum te : TestEnum.values()) // Bitte beachten, values() hat NICHTS mit unserer private Variable value zu tun!!
        {
            if(te.getValue() == c)
                return te;
        }
    
        // OHJE, evtl. TestEnum.SOME_DEFAULT_VALUE oder IllegalArgumentException, etc.
    }
    
    ...
    
    TestEnum te = valueToTestEnum(c);
    
    switch(te)
    {
        case TEST_A: // TestEnum. brauhcst du nicht davor zu schreiben, erkennt er am switch!
            // do something
    }
    

    MfG SideWinder



  • Die Umwandlungsmethode ist natürlich sehr nett als static-Methode im enum selbst aufgehoben.

    Warum bietet Java nicht diese Umwandlungsmethode? Weil Java von Zeile 29 im oberen Code-Ausschnitt schlichtweg nichts wissen kann. Nicht jedes Enum muss ein solches getValue() haben. Könnte ja auch getSomethingElse(), etc. sein

    Noch ein Addon: Bitte höre auf C++ in Java programmieren zu wollen. Wenn du C++ so gerne hast, dann programmiere einfach C++ 🙂 Ist auch eine tolle Sprache. Java ist eben nicht C++ und C++ ist nicht Java. Die "best practices" etwas zu erledigen sind teilweise doch sehr verschieden (wenn auch beide größtenteils objektorientierte Sprachen sind).

    MfG SideWinder



  • Leider kann man kein Java Applett in C++ programieren

    MfG



  • wenn ich die Funktion als Member meine enum Klasse baue habe ich das problem wie überschreibe ich mich selbst

    public void Set(short value)
        {
            for(TestEnum te : TestEnum.values())
            {
                if(te.getValue() == value)
                    this = te; // geht nicht
            }
        }
    

    habt ihr noch eine Idee?



  • Destiniy schrieb:

    wenn ich die Funktion als Member meine enum Klasse baue habe ich das problem wie überschreibe ich mich selbst

    Das geht nicht. Warum um alles in der Welt soll sich ein Enum verändern?



  • ich möchte ja nicht das enum verändern sondern den Wert der Variable die von dem enum typ ist



  • Welchen Wert?
    Enumwerte sind statische Konstanten, die sich zur Laufzeit nicht ändern. Wenn du einer Enumvariablen einen neuen Enumwert zuweisen willst, geht das mittels einfacher Zuweisung:

    enum Test {
        EINS, ZWEI
    }
    
    // ...
    
    Test x = Test.EINS;
    x = Test.ZWEI;
    


  • ja und wenn ich einem ByteStream von einem Socket bekomme wo zwei Bytes genau diesen Enumwert Bilden

    Wie bekomme ich den dann zugewiesen?

    Du solltest dir vielleicht mal den ganzen thread durchlesen



  • Destiniy schrieb:

    Du solltest dir vielleicht mal den ganzen thread durchlesen

    Hoffentlich hast du das auch gemacht. Denn das mit dem Stream steht in einem anderen Post 😃

    Ich kann nur wiederhollen, dass Enum's feste Konstanten sind und sich der Wert, Name, ... nie ändern!


Log in to reply