0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Максимальное количество значений в enum Часть I

Как получить максимальное значение enum?

как получить максимальное значение enum ?
enum со временем может дополняться и потому каждый раз изменять послений где нужно не вариант

Добавлено через 7 минут
можно конечно взять GetValues и пробегаться по ним.
может что есть изящнеё?

Как из int получить коллекцию enum-ом?
Привет! Есть перечисление: public enum UserRoles < None = 0, Admin = 1, Manager = 2.

Как получить максимальное значение integer?
как получить максимальное значение integer ? в с++ это INT_MAX; а в паскале?

я использую значение переменной для хранения этого enum. а также для хранения другого int значения.
вот и нужно узнать максимальный enum чтобы себя обезопасить

пока я просто беру так

enum или int, звучит как оба одновременно, это как?

в общем складывается ощущение, что вы либо не знаете что делаете, либо не владеете терминами чтобы это выразить.
Попробуйте описать саму задачу, а не то как вы ее пытаетесь решить, ну и кусок кода побольше, т.к. этот слишком оторван от контекста

я просто взял как название гипотетической переменной.

да ладно я понял что либо просто число вбить, либо изменить подход

Добавлено через 20 минут
допустим можно получить максимальное значение

а чем ваш код не обобщенный? передавайте любой тип enum и он вернет максимальное значение

вот еще такой вариант для интовых энумов

а я его пихаю внутрь.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как получить максимальное значение из вычисляемого поля в отчете Access?
Добрый день, уважаемые знатоки. Суть вопроса в следующем: есть отчет построенный на запросе, в.

Получить максимальное значение в столбце
Получить максимальное значение в столбце посредством Linq to SQL запроса не использую цикл по.

Получить максимальное значение из заданных
Паскаль. Задачи с разветвляющей структурой 1)Даны действующие числа x,y,z. Получить max(x+y+z.

Получить максимальное значение по столбцу
Как мне получить максимальное значение по столбцу ID?

Как получить элемент enum по индексу?
Здравствуйте. Подскажите, пожалуйста. Вот есть у меня enum: export enum McsSelectorType <.

Soft, интернет, безопасность: новости, статьи, советы, работа

Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus «Освітні вимірювання, адаптовані до стандартів ЄС». В рамк.

суббота, 11 января 2020 г.

Максимальное количество значений в enum Часть I

В нём он задаётся вопросом, какое максимальное количество значений может быть определено в перечислении ( enum ) в Java. После ряда экспериментов и применения чёрной магии ConstantDynamic (JEP 309) автор вопроса приходит к числу 8191.

Читать еще:  Avast представила защищенный браузер Avast Secure Browser - CNews

В серии из двух статей поищем теоретические пределы числа элементов в перечислении, попробуем к ним приблизиться на практике и попутно выясним, чем может помочь JEP 309.

Рекогносцировка

Обзорная глава, в которой мы впервые видим перечисление дизассемблированным.

Для начала посмотрим, во что транслируется следующее перечисление:

После компиляции и дизассемблирования:

В листинге нас встречают

— По одному public static final полю для каждого значения, определённого в перечислении

— Приватное синтетическое поле $VALUES , деталь реализации метода values()

— Реализация методов values() и valueOf()

— Блок статической инициализации, где собственно и происходит всё самое интересное. Рассмотрим его подробнее.

В виде java-кода последний выглядит примерно так:

Вначале создаются экземпляры элементов перечисления. Созданные экземпляры немедленно записываются в соответствующие public static final поля.

Затем создаётся и заполняется массив со ссылками на экземпляры всех элементы перечисления. Ссылки достаются из полей класса, которые мы инициализировали абзацем выше. Заполненный массив сохраняется в private static final поле $VALUES .

После этого перечисление готово к работе.

Бутылочное горлышко

Скучная глава, в которой мы ищем ограничения на количество элементов перечисления.

Начать поиски можно с главы JLS §8.9.3 «Enum Members»:

Итак, у каждого класса-перечисления есть метод values() , который возвращает массив со всеми объявленными в данном перечислении элементами. Из этого следует, что сферическое перечисление в вакууме не может содержать более Integer.MAX_VALUE + 1 элементов.

Движемся дальше. Перечисления в Java представляются в виде наследников класса java.lang.Enum , а следовательно на них распространяются все ограничения, присущие классам в JVM.

Посмотрим на высокоуровневое описание структуры class-файла, приведённое в JVMS §4.1 «The ClassFile Structure»:

Как мы уже знаем из JLS §8.9.3, для каждого элемента перечисления в результирующем классе создаётся одноимённое поле. Число полей в классе задаёт 16-битное беззнаковое fields_count , что ограничивает нас 65_535 полями в одном class-файле или 65_534 элементами перечисления. Одно поле зарезервировано под массив $VALUES , клон которого возвращает метод values() . Это не прописано явно в спецификации, но вряд ли получится придумать более изящное решение.

Имена полей, методов, классов, константные значения и многое другое хранится в пуле констант.
Если вы совсем ничего не знаете про внутреннее устройство пула констант, рекомендую почитать древнюю статью от lany. Не смотря на то, что с момента её написания в пуле констант появилось много нового и интересного, основные принципы остаются неизменными.

Размер пула констант класса ограничен также числом в 65_535 элементов. Пул констант корректно сформированного класса никогда не бывает пуст. Как минимум, там будет имя этого класса.

К примеру, пул констант класса пустого перечисления, скомпилированный javac из OpenJDK 14-ea+29 без отладочной информации содержит 29 вхождений.

Из этого следует, что число в 65_534 элемента в одном перечислении также недостижимо. В лучшем случае можем рассчитывать на 65_505 или близкое к этому число.

Последний аккод в этом затянувшемся вступлении:

Записать значение в static final поле можно только в блоке статической инициализации, который на уровне class-файла представлен методом с именем . Байткод любого метода при этом не может занимать более 65_535 байтов. Знакомое число, не правда ли?

Одна инструкция записи в статическое поле putstatic занимает 3 байта, что даёт нам грубую оценку в 65_535 / 3 = 21_845 . На самом деле эта оценка завышена. Значение для записи в поле инструкция берёт с вершины стека, которое туда поместила одна из предыдущих инструкций. И эта инструкция тоже занимает драгоценные байты. Но даже если не принимать это во внимание, полученное число всё равно значительно меньше 65_505.

Читать еще:  Microsoft Safety Scanner — антивирусный сканер

Резюмируя:
— Формат class-файла ограничивает максимальное число элементов перечисления примерно 65_505
— Механизм инициализации static final полей ограничивает нас ещё сильнее. Теоретически — до 21_845 элементов максимум, на практике это число ещё меньше

В заключительной статье цикла займёмся нездоровой оптимизацией и генерацией class-файлов.

Что такое перечисления в Java? (java enum)

Перечисление или java enum — это набор именованных констант, который помогает в определении своих собственных типов данных. Когда вы можете определить тип переменных в программе, становится легко их определить.

Перечисление — это в основном список именованных констант. В Java это определяет тип класса. Он может иметь конструкторы, методы и переменные экземпляра. Он создается с помощью ключевого слова enum. По умолчанию каждая константа перечисления имеет вид.

Хотя перечисление определяет тип класса и имеет конструкторы, вам не нужно создавать экземпляр перечисления с помощью новой переменной. Переменные перечисления используются и объявляются так же, как переменные примитива.

Объявление enum может быть сделано вне Класса или внутри Класса. Но мы не можем объявить Enum внутри метода. Давайте рассмотрим небольшой пример, чтобы понять его декларацию.

1. Объявление перечисления в Java вне класса

2. Объявление перечисления в Java внутри класса

Первая строка внутри типа enum должна быть списком констант. Затем вы можете использовать методы, переменные и конструктор. По сути, enum представляет группу переменных и констант.

  • Enum в Java в основном улучшает безопасность типов.
  • Его можно по-разному использовать в примерах переключения.
  • Enum может быть легко пройден.
  • Перечисление имеет поля, конструкторы и методы.
  • Enum в основном реализует много интерфейсов, но не может расширять какой-либо класс, потому что он внутренне расширяет класс Enum.

Перечисление с использованием оператора Switch

Значение перечисления также может использоваться для управления оператором switch. Необходимо, чтобы все операторы case использовали константы из того же перечисления, что и оператор switch. Ниже пример демонстрирует то же самое.

Values() и метод ValueOf()

Values(): при создании enum компилятор Java внутренне добавляет метод values(). Этот метод возвращает массив, содержащий все значения перечисления.

ValueOf(): этот метод используется для возврата константы перечисления, значение которой равно строке, переданной в качестве аргумента при вызове этого метода.

Теперь давайте напишем программу, чтобы понять эти методы более подробно.

Вот как вы можете использовать метод Values(), чтобы вернуть массив, содержащий все перечисления, присутствующие в методе, и Valueof(), чтобы вернуть константу перечисления.

Перечисление с помощью конструктора, переменной экземпляра и метода

По сути, перечисление может содержать конструктор и выполняется отдельно для каждой константы перечисления во время загрузки класса перечисления. Кроме того, перечисление может создавать конкретные методы.

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

Что нужно знать?

1). Перечисления в Java являются типобезопасными и имеют собственное пространство имен. Это означает, что ваше перечисление будет иметь тип, например «Валюта» в приведенном ниже примере, и вы не можете присвоить какое-либо значение, кроме указанного в константах перечисления.

2). Enum в Java — это ссылочные типы, такие как класс или интерфейс, и вы можете определить конструктор, методы и переменные внутри, что делает его более мощным, чем Enum в C и C ++, как показано в следующем примере.

Читать еще:  Использование ReSwift: написание приложения Memory Game

3). Вы можете указать значения констант перечисления во время создания, как показано в примере ниже:

Но для этого вам необходимо определить переменную-член и конструктор, потому что PENNY (1) фактически вызывает конструктор, который принимает значение int, см. Пример ниже.

Конструктор должен быть закрытым, любой другой модификатор доступа приведет к ошибке компиляции. Теперь, чтобы получить значение, связанное с каждой монетой, вы можете определить общедоступный метод getValue() внутри перечисления Java, как любой обычный класс. Кроме того, точка с запятой в первой строке не обязательна.

4) Константы перечисления неявно статичны и окончательны и не могут быть изменены после создания. Например, приведенный ниже код приведет к ошибке компиляции:

Последнее поле EnumExamples.Currency.PENNY нельзя переназначить.

5) Может использоваться в качестве аргумента в операторе switch и с «case:», например, с примитивным типом int или char. Эта особенность делает их очень полезными для операций переключения. Давайте посмотрим, как использовать enum внутри оператора switch:

Поскольку константы, определенные внутри Enum, являются окончательными, вы можете безопасно сравнивать их, используя «==», оператор равенства, как показано в следующем примере:

Сравнение объектов с использованием оператора == не рекомендуется. Всегда используйте метод equals() или compareTo() для сравнения объектов.

7). Компилятор Java автоматически генерирует метод static values() для каждого перечисления. Метод Values() возвращает массив констант Enum в том же порядке, в котором они перечислены, и вы можете использовать values() для перебора значений, как показано в примере ниже:

8). Он также может переопределять методы. Давайте посмотрим на пример переопределения метода toString() внутри Enum, чтобы предоставить содержательное описание для констант перечислений.

А вот как это выглядит при отображении:

9). Два новых класса коллекции EnumMap и EnumSet добавлены в пакет коллекции для поддержки. Эти классы представляют собой высокопроизводительную реализацию интерфейса Map and Set в Java, и мы должны использовать их всякий раз, когда есть возможность.

EnumSet не имеет общедоступного конструктора, вместо этого он предоставляет фабричные методы для создания экземпляра, например. EnumSet.of() методы. Этот дизайн позволяет EnumSet внутренне выбирать между двумя различными реализациями в зависимости от размера констант.

Если Enum имеет менее 64 констант, чем EnumSet использует класс RegularEnumSet, который внутренне использует длинную переменную для хранения этих 64 констант, а если Enum имеет больше ключей, чем 64, то он использует JumboEnumSet.

10). Вы не можете создать экземпляр перечислений с помощью оператора new в Java, потому что конструктор может быть только частным, а константы Enums могут быть созданы только внутри него самого.

11). Экземпляр создается, когда какие-либо константы Enum сначала вызываются или упоминаются в коде.

12). Может реализовать интерфейс и переопределить любой метод, такой как обычный класс. Также стоит отметить, что Enum в Java неявно реализует как Serializable, так и Comparable интерфейс. Давайте посмотрим и пример того, как реализовать интерфейс:

13). Вы можете определить абстрактные методы внутри Enum, а также можете предоставить другую реализацию для разных экземпляров. Давайте посмотрим на пример использования абстрактного метода внутри.

В этом примере, поскольку каждая монета будет иметь разный цвет, мы сделали метод color() абстрактным и позволили каждому экземпляру Enum определять свой собственный цвет. Вы можете получить цвет любой монеты, просто вызвав метод color(), как показано в примере ниже:

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector