2011-02-01 33 views
5

Trong C, đôi khi tôi sử dụng nhưJava - cấu trúc thay đổi int enums

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ó bất kỳ tương đương Java?

+0

Tại sao? Đây có phải là chỉ để bạn có thể xử lý bộ chúng? – OrangeDog

Trả lời

15

Sử dụng EnumSet.

Trích từ Link trên đó đủ điều kiện làm ví dụ:

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

Bạn có thể làm một cái gì đó như sau:

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

Sau đó, bạn có thể gọi getNum() trên enum để có được số lượng bạn chỉ định trên tạo ra các hằng số. Enums mạnh hơn và linh hoạt hơn trong Java so với các ngôn ngữ khác nói chung - chúng được thêm vào sau rất nhiều nhưng về cơ bản là các lớp hoàn toàn bị thổi (và bạn có thể thao tác chúng như vậy.)

5

Bạn không cần logic nhị phân đó với enums trong java nữa. Bạn chỉ cần enum chính nó và EnumSet.

Ví dụ:

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

Không thực sự biết những gì là mã C có, nhưng đây là gần nhất bạn sẽ nhận được nó trong 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

bạn nói đúng rằng đó là phiên bản java gần nhất của cùng một chương trình, nhưng về mặt lý thuyết thì nó sai. Tất cả những thay đổi được thực hiện để sử dụng logic nhị phân với các giá trị (1, 2, 4, 8 ...) tức là các toán tử '|' và '&'. Java đã giới thiệu 'EnumSet' làm cho mọi thứ dễ dàng hơn và cho phép loại bỏ logic nhị phân. – Roman

+1

@Roman Tôi đồng ý hoàn toàn. Như tôi đã nói, tôi thậm chí không thực sự hiểu được sự dịch chuyển bit, đó là một di tích từ thời cổ đại. Java giấu những chi tiết này từ tôi và tôi biết ơn. Tuy nhiên, mục tiêu của tôi là lấy mã để biên dịch với ít sửa đổi nhất có thể, và tôi đoán tôi đã đạt được điều đó (ngay cả khi nó không có ý nghĩa nhiều) –

0

Nếu không giải quyết yêu cầu chuyển dịch của bạn bạn có thể làm:

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

Nếu bạn google "Java Enums" bạn có thể tìm thấy ví dụ về cách triển khai m. Về cơ bản trong Java, Enums giống như các lớp, chúng có các hàm tạo, các phương thức, v.v. Và bạn có thể ánh xạ các giá trị tới nhãn không đổi, vì vậy enum của bạn dễ dàng được chuyển đổi thành một enum Java.

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

    private int value; 

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

Sắp xếp. Bạn có thể xác định một enum Java và xây dựng từng loại enum với các giá trị của bạn:

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

Sau đó cờ phương thức() sẽ trả về giá trị thực tế của bạn. Hoặc tốt hơn bạn vẫn có thể xác định phương pháp trên enums của bạn để làm một cái gì đó hữu ích tùy thuộc vào giá trị của lá cờ.

0

Trong mục Java Emun không thể được gán một giá trị như vậy, bạn cần một cái gì đó như:

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

Sau đó, bạn sẽ có giá trị như thế này trong mã khác của bạn:

double x = Classname.UIViewAutoresizingNone.value; 

Điều này giả định bạn cần để có thể truy cập giá trị từ mã khác và bạn không chỉ thêm nó để đảm bảo mỗi giá trị enum khác nhau. Đối với trường hợp thứ hai trong Java bạn không cần phải làm điều này cả. Ví dụ: thao tác này sẽ hoạt động:

public enum Classname { 
    UIViewAutoresizingNone, 
    UIViewAutoresizingFlexibleLeftMargin, 
    UIViewAutoresizingFlexibleWidth, 
    .... 
Các vấn đề liên quan