Java - сдвигать перечисления - PullRequest
5 голосов
/ 01 февраля 2011

В C я иногда использовал такие структуры, как

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?

Ответы [ 8 ]

15 голосов
/ 01 февраля 2011

Использование 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);
    }

}
5 голосов
/ 01 февраля 2011

Вам больше не нужна эта двоичная логика с перечислениями в 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 голосов
/ 01 февраля 2011

Не совсем знаю, что делает этот 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;
    }
 };
0 голосов
/ 01 февраля 2011

В элементах 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,
   ....
0 голосов
/ 01 февраля 2011

Вроде. Вы можете определить перечисление 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;
    }
};

Тогда метод flag () вернет ваше фактическое значение флага. Или, что еще лучше, вы можете определить методы в своих перечислениях, чтобы сделать что-то полезное в зависимости от значения флага.

0 голосов
/ 01 февраля 2011

Если вы используете Google Enums, вы можете найти примеры их реализации.По сути, в Java Enums похожи на классы, у них есть конструкторы, методы и т. Д. И вы можете сопоставить значения с меткой константы, чтобы ваше перечисление было легко преобразовано в перечисление Java.

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

    private int value;

    private UIViewAutoresizingConstants(int v)
    {
        this.value = v;
    }
}
0 голосов
/ 01 февраля 2011

Не обращаясь к вашему требованию смены, вы можете сделать:

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 голосов
/ 01 февраля 2011

Вы можете сделать что-то вроде следующего:

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, чем в других языках в целом - они были добавлены намного позже, но, по сути, являются полностью раздутыми классами (и вы можете манипулировать ими как таковыми).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...