2011-02-01 2 views
5

В C, я иногда используются такие структуры, какJava - сдвиг ИНТ перечислений

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

ответ

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

+1

@Roman Я полностью согласен. Как я уже сказал, я даже не понимаю этого смещения, это реликвия с древних времен. Java скрывает эти данные от меня, и я благодарен. Тем не менее, моя цель состояла в том, чтобы скомпилировать код с минимальными изменениями, и я предполагаю, что я это сделал (даже если это не имеет большого смысла) –

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

Если вы используете Google «Перечисления Java», вы можете найти примеры того, как реализовать м. В основном в 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; 

Это означает, что вам нужно иметь доступ к значению из другого кода, и вы не просто добавляли его, чтобы удостовериться, что каждое значение перечисления отличается. Для последнего случая в Java вам вообще не нужно это делать. Например, это будет работать:

public enum Classname { 
    UIViewAutoresizingNone, 
    UIViewAutoresizingFlexibleLeftMargin, 
    UIViewAutoresizingFlexibleWidth, 
    .... 
Смежные вопросы