2011-02-01 97 views
5

在C,我有時用結構如爪哇 - 轉變INT枚舉

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

是否有任何Java相當於?

+0

爲什麼?這只是因爲你可以處理它們的集合嗎? – OrangeDog 2011-02-01 14:42:18

回答

15

使用EnumSet。以上這

摘錄從鏈接資格作爲例子:

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

你可以做類似如下:

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; 
    } 
} 

然後,您可以致電枚舉getNum()讓你在不斷的創作中指定的號碼。枚舉很多更強大,比一般其他語言靈活的Java - 他們被很多後來添加的,但基本上完全吹塑成型類

5

你並不需要一個二進制邏輯(你可以操縱它們的方式。)與java中的枚舉更多。你只需要enum本身和EnumSet

例如:

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

真的不知道C代碼做什麼,但這裏是最接近你會得到它在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

你是對的,它是同一個程序中最接近的java版本,但意識形態上它是錯誤的。所有這些轉換都是使用具有值(1,2,4,8 ...)的二進制邏輯,即運算符`|`和`&`。 Java引入了`EnumSet`,它使得事情變得簡單並且允許擺脫二進制邏輯。 – Roman 2011-02-01 14:33:52

0

不解決您的移動要求你可以這樣做:

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

如果你是谷歌「Java Enums」,你可以找到如何實現米基本上在Java中,枚舉類似於類,它們具有構造函數,方法等......並且您可以將值映射到常量標籤,因此您的枚舉很容易轉換爲Java枚舉。

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

    private int value; 

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

整理。您可以定義一個Java枚舉和構造每個枚舉類型與你的價值觀:

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; 
    } 
}; 

然後,該方法標誌()將返回實際的標誌值。或者更好的是你可以在你的枚舉上定義方法來根據標誌的值做一些有用的事情。

0

在Java Emun項目無法分配了類似的一個值,你需要這樣的:

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; 
    } 
} 

然後你會在你的其他代碼中得到這樣的值:

double x = Classname.UIViewAutoresizingNone.value; 

這asssuming你需要能夠從其他代碼訪問的價值,你不只是添加它,以確保每一個枚舉值是不同的。對於Java中的後一種情況,您根本不需要這樣做。例如,這將工作:

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