2011-02-01 13 views
5

In C, a volte usato come ad esempioJava - strutture di turno int enumerazioni

enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
}; 
typedef NSUInteger UIViewAutoresizing; 

C'è qualche equivalente Java?

+0

Perché? Questo è solo così puoi gestirli in serie? – OrangeDog

risposta

15

Utilizzare EnumSet.

Estratto dal link qui sopra, che si qualifica come ad esempio:

package resolver; 

import java.util.EnumSet; 

public class EnumPatternExample { 

    public enum Style { 
     BOLD, ITALIC, UNDERLINE, STRIKETHROUGH 
    } 

    public static void main(String[] args) { 
     final EnumSet<Style> styles = EnumSet.noneOf(Style.class); 
     styles.addAll(EnumSet.range(Style.BOLD, Style.STRIKETHROUGH)); // enable all constants 
     styles.removeAll(EnumSet.of(Style.UNDERLINE, Style.STRIKETHROUGH)); // disable a couple 
     assert EnumSet.of(Style.BOLD, Style.ITALIC).equals(styles); // check set contents are correct 
     System.out.println(styles); 
    } 

} 
0

Si potrebbe fare qualcosa di simile al seguente:

enum EnumTest { 
    ONE(1), //Specify value to pass to constructor 
    TWO(2), 
    THREE(3); 

    private int num; 

    private EnumTest(int num) { //Enum constructor must be private 
     this.num = num; 
    } 

    public int getNum() { //Get the value specified on the constant's creation 
     return num; 
    } 
} 

È quindi possibile chiamare getNum() sul enum per ottenere il numero specificato sulla creazione del costante. Le enumerazioni sono molto più potenti e flessibili in Java che in altre lingue in generale - sono state aggiunte molto dopo ma sono essenzialmente classi completamente ignorate (e puoi manipolarle come tali.)

5

Non hai bisogno di quella logica binaria con enum in java più. Hai solo bisogno di enum e EnumSet.

Ad esempio:

enum Color { 
    Red, Green, Blue, Orange, White, Black 
} 

... 

EnumSet<Color> mainColors = EnumSet.of(Color.Red, Color.Green, Color.Blue); 
Color color = getSomeColor(); 
if (mainColors.contains(color)) { 
    //mainColors is like Red | Green | Blue, 
    //and contains() is like color & mainColors 
    System.out.println("Your color is either red or blue or green"); 
} 
3

Non so davvero cosa che il codice C fa, ma ecco il più vicino si arriva ad esso in Java:

enum UIView { 
    UIViewAutoresizingNone     (0), 
    UIViewAutoresizingFlexibleLeftMargin (1 << 0), 
    UIViewAutoresizingFlexibleWidth  (1 << 1), 
    UIViewAutoresizingFlexibleRightMargin (1 << 2), 
    UIViewAutoresizingFlexibleTopMargin (1 << 3), 
    UIViewAutoresizingFlexibleHeight  (1 << 4), 
    UIViewAutoresizingFlexibleBottomMargin (1 << 5); 
    private final int value; 

    private UIView(int value){ 
     this.value = value;} 

    public int getValue(){ 
     return value; 
    } 
}; 
+2

hai ragione che è la versione java più vicina dello stesso programma, ma ideologicamente è sbagliato. Tutti questi cambiamenti sono fatti per usare la logica binaria con valori (1, 2, 4, 8 ...), cioè gli operatori '|' e '&'. Java ha introdotto 'EnumSet' che semplifica le cose e consente di liberarsi della logica binaria. – Roman

+1

@Roman Sono totalmente d'accordo. Come ho già detto, non capisco nemmeno molto questo cambio di bit, è una reliquia dei tempi antichi. Java nasconde questi dettagli da me e sono grato. Tuttavia, il mio obiettivo era quello di ottenere il codice da compilare con il minor numero possibile di modifiche, e credo di averlo realizzato (anche se non ha molto senso) –

0

Senza affrontare il vostro requisito spostamento Si potrebbe fare:

enum MyEnum { 
     UIViewAutoresizingNone(0), 
     UIViewAutoresizingFlexibleLeftMargin(1), 
     UIViewAutoresizingFlexibleWidth(2), 
     UIViewAutoresizingFlexibleRightMargin(3), 
     UIViewAutoresizingFlexibleTopMargin(4), 
     UIViewAutoresizingFlexibleHeight(5), 
     UIViewAutoresizingFlexibleBottomMargin(6); 

     private int value; 

     private MyEnum(int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 
    }; 
0

Se si google "Java Enums" è possibile trovare esempi su come implementare il m. Fondamentalmente in Java, le enumerazioni sono come le classi, hanno costruttori, metodi, ecc ... Ed è possibile mappare i valori sull'etichetta costante, così il tuo enum può essere facilmente convertito in un enum Java.

public enum UIViewAutoresizingConstants 
{ 
    UIViewAutoresizingNone(0), 
    UIViewAutoresizingFlexibleLeftMargin(1 << 0); 

    private int value; 

    private UIViewAutoresizingConstants(int v) 
    { 
     this.value = v; 
    } 
} 
0

Sort of. È possibile definire un enum Java e costruire ogni tipo enum con i propri valori:

public enum UIViewAutoresizing { 
    None(0), 
    FlexibleLeftMargin(1 << 0), 
    FlexibleWidth(1 << 1), 
    FlexibleRightMargin(1 << 2), 
    FlexibleTopMargin(1 << 3), 
    FlexibleHeight(1 << 4), 
    FlexibleBottomMargin(1 << 5); 

    private final int flag; 

    private MessageType(int flag) { 
     this.flag = flag; 
    } 

    public int flag() { 
     return flag; 
    } 
}; 

Poi la bandiera metodo() restituirà il valore della bandiera reale. O meglio ancora puoi definire i metodi sul tuo enumer per fare qualcosa di utile a seconda del valore della bandiera.

0

In elementi Java emun non può essere assegnato un valore del genere, avresti bisogno di qualcosa come:

public enum Classname { 
    UIViewAutoresizingNone(0), 
    UIViewAutoresizingFlexibleLeftMargin (1 << 0), 
    UIViewAutoresizingFlexibleWidth(1 << 1), 
    UIViewAutoresizingFlexibleRightMargin(1 << 2), 
    UIViewAutoresizingFlexibleTopMargin(1 << 3), 
    UIViewAutoresizingFlexibleHeight(1 << 4), 
    UIViewAutoresizingFlexibleBottomMargin(1 << 5), 

    private final double value; 

    // constructor 
    private Classname(double v) { 
     this.value = v; 
    } 

    public double value() { 
     return value; 
    } 
} 

allora si avrebbe un valore come questo nel tuo altro codice:

double x = Classname.UIViewAutoresizingNone.value; 

Questo significa che è necessario essere in grado di accedere al valore da un altro codice e non lo si è semplicemente aggiunto per assicurarsi che ciascun valore di enumerazione fosse diverso. Per quest'ultimo caso in Java non è necessario farlo affatto. Ad esempio, questo funzionerà:

public enum Classname { 
    UIViewAutoresizingNone, 
    UIViewAutoresizingFlexibleLeftMargin, 
    UIViewAutoresizingFlexibleWidth, 
    ....