Перечисленные значения Java - PullRequest
0 голосов
/ 10 ноября 2011

Как рассчитывается значение перечисления?Компилятор дает ему статическое значение?Что это за значение?

Причина, по которой я спрашиваю, заключается в том, что мне было интересно, каковы будут последствия использования значений enum для соединения tcp (или любого межпроцессного).(Под значением enum я подразумеваю Enum.VALUE). Очевидно, что вы не сможете создавать пакеты, совместимые с вашей программой, на другом языке, если вы не знаете заранее определенные значения каждого перечисления.Так можно ли выяснить «реальные» значения каждого?И будут ли две Java-программы, использующие один и тот же файл «enum», понимать друг друга?

Это чисто теоретический вопрос, пожалуйста, не ругайте.Хотя указатели хороши.

Ответы [ 4 ]

4 голосов
/ 10 ноября 2011

Как уже было объяснено, не полагайтесь на базовые реализации. Вместо этого создайте свой enum для хранения такого рода информации под вашим контролем. Представьте, что у вас есть три команды для отправки на какой-либо встроенный контроллер, которые записываются в регистр. Вы хотите использовать перечисления, чтобы дать вам высокоуровневое представление команд, но в какой-то момент вам понадобятся эти надоедливые битовые комбинации:

public enum EmbeddedControllerCommand {

    FOO(0x001), BAR(0x010), BAZ(0x100);

    private int bitPattern = 0;

    EmbeddedControllerCommand(int bitPattern) {
        this.bitPattern = bitPattern;
    }

    public int getBitPattern() {
        return this.bitPattern;
    }

}

Просто позвоните EmbeddedControllerCommand.FOO.getBitPattern(), чтобы получить шаблон команды для команды FOO.

2 голосов
/ 10 ноября 2011

Если вы обращаетесь к Enum JavaDoc , вы можете прочитать, что метод Enum.ordinal () возвращает числовое постоянное значение, которое определяется порядком объявлений Enum в файл класса.

Например, рассмотрим эти константы перечисления в алфавитном порядке:

public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    ORANGE;// ORANGE.ordinal() == 1
    PEAR,  // PEAR.ordinal()   == 2
}

Но если мы добавим BANANA в алфавитном порядке, посмотрим, как изменятся значения, нарушив любой код, который на них опирается:

public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    BANANA,// BANANA.ordinal() == 1
    ORANGE;// ORANGE.ordinal() == 2
    PEAR,  // PEAR.ordinal()   == 3
}

Это означает, что до тех пор, пока вы используете одну и ту же версию исходного кода, вы можете рассчитывать на то, что базовое значение будет одинаковым, и использовать его в ситуациях, когда других вариантов нет. Я не говорю никаких других вариантов, потому что, делая ваш код зависимым от порядка перечислений, это делает код более хрупким, тогда как если вы не полагаетесь на порядковое значение, вы можете изменить порядок существующих или вставить новые константы перечисления по желанию.

Теперь, вы бы согласились с легким руганием за то, что вы не читали JavaDocs полностью перед публикацией? :)

2 голосов
/ 10 ноября 2011

в Java Enums имеют целочисленную ссылку, которую Java называет порядковым.Например, вы можете сделать yourEnumVariable.ordinal(), чтобы получить номер int переменной enum.Числа присваиваются таким образом, что первый в списке получает номер 0, второй номер 1. и т. Д.

Однако в вашем случае кажется, что вам не следует беспокоиться о том, что является внутренним представлением перечислений.Вы должны решить, какой протокол вы будете использовать для передачи информации.После этого вы можете подумать о том, как передавать перечисляемые значения.В любом случае вам, вероятно, придется создать несколько классов сопоставления для протокола для сопоставления с Java на протокол.

0 голосов
/ 10 ноября 2011

Вы не должны полагаться на предварительно заданное значение enum, данное компилятором Java. Разные языки имеют разные схемы работы с enum. В Java enum может рассматриваться как класс и объекты (не совсем для той же цели), так что вы можете создать конструктор в вашем enum и инициализировать enum тем значением, которое вы хотите. Вот довольно четкие примеры:

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

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