Как из строки сделать enum java
Кроме отдельных примитивных типов данных и классов в Java есть такой тип как enum или перечисление. Перечисления представляют набор логически связанных констант. Объявление перечисления происходит с помощью оператора enum, после которого идет название перечисления. Затем идет список элементов перечисления через запятую:
enum Day
Перечисление фактически представляет новый тип, поэтому мы можем определить переменную данного типа и использовать ее:
public class Program < public static void main(String[] args) < Day current = Day.MONDAY; System.out.println(current); // MONDAY >> enum Day
Перечисления могут использоваться в классах для хранения данных:
public class Program < public static void main(String[] args) < Book b1 = new Book("War and Peace", "L. Tolstoy", Type.BELLETRE); System.out.printf("Book '%s' has a type %s", b1.name, b1.bookType); switch(b1.bookType)< case BELLETRE: System.out.println("Belletre"); break; case SCIENCE: System.out.println("Science"); break; case SCIENCE_FICTION: System.out.println("Science fiction"); break; case PHANTASY: System.out.println("Phantasy"); break; >> > class Book < String name; Type bookType; String author; Book(String name, String author, Type type)< bookType = type; this.name = name; this.author = author; >> enum Type
Само перечисление объявлено вне класса, оно содержит четыре жанра книг. Класс Book кроме обычных переменных содержит также переменную типа нашего перечисления. В конструкторе мы ее также можем присвоить, как и обычные поля класса.
С помощью конструкции switch..case можно проверить принадлежность значения bookType определенной константе перечисления.
Методы перечислений
Каждое перечисление имеет статический метод values() . Он возвращает массив всех констант перечисления:
public class Program < public static void main(String[] args) < Type[] types = Type.values(); for (Type s : types) < System.out.println(s); >> > enum Type
Метод ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0):
System.out.println(Type.BELLETRE.ordinal()); // 1
Конструкторы, поля и методы перечисления
Перечисления, как и обычные классы, могут определять конструкторы, поля и методы. Например:
public class Program < public static void main(String[] args) < System.out.println(Color.RED.getCode()); // #FF0000 System.out.println(Color.GREEN.getCode()); // #00FF00 >> enum Color < RED("#FF0000"), BLUE("#0000FF"), GREEN("#00FF00"); private String code; Color(String code)< this.code = code; >public String getCode() < return code;>>
Перечисление Color определяет приватное поле code для хранения кода цвета, а с помощью метода getCode оно возвращается. Через конструктор передается для него значение. Следует отметить, что конструктор по умолчанию приватный, то есть имеет модификатор private. Любой другой модификатор будет считаться ошибкой. Поэтому создать константы перечисления с помощью конструктора мы можем только внутри перечисления.
Также можно определять методы для отдельных констант:
public class Program < public static void main(String[] args) < Operation op = Operation.SUM; System.out.println(op.action(10, 4)); // 14 op = Operation.MULTIPLY; System.out.println(op.action(6, 4)); // 24 >> enum Operation < SUM< public int action(int x, int y)< return x + y;>>, SUBTRACT < public int action(int x, int y)< return x - y;>>, MULTIPLY < public int action(int x, int y)< return x * y;>>; public abstract int action(int x, int y); >
Перечисления enum
В простейшей форме перечисление — это список именованных констант. Но в Java перечисления имеют более сложный функционал, чем в других языках программирования. Они могут иметь конструкторы, методы и переменные экземпляра.
Перечисления создаются с использованием ключевого слова enum. Создадим перечисление семейства кошачьих:
enum Cat
Идентификаторы в фигурных скобках называются константами перечисления. Каждый из них явно объявлен как открытый статический финальный член класса Cat. Объявив перечисление, вы можете создавать переменные этого типа. Но делать это нужно без оператора new, а в упрощенном виде. Объявим переменную manul перечислимого типа Cat.
Cat manul;
Вы можете присвоить переменной только те значения, которые определены в перечислении, например:
manul = Cat.Manul;
Обратите внимание, что во время присваивания вы указываете и тип Cat.
Использование перечисляемых переменных позволят избежать ошибок. Например, мы хотим использовать только числа 1, 2, 3 и такой способ не позволит использовать числа 0, 5, 9 и т.д.
Перечислимые константы можно проверить на равенство:
if (manul == Cat.Manul)
Также их можно применять в конструкции switch, где у операторов case используются константы из перечисления enum. При этом имена констант используются без имени типа перечисления.
enum Cat < Leopard, Puma, Lion, Tiger, Manul >public void onClick(View v) < Cat cat; cat = Cat.Manul; String result = ""; switch (cat) < case Leopard: result = "Я леопард"; break; case Puma: result = "Я пума"; break; case Lion: result = "Я царь зверей"; break; case Tiger: result = "Я тигра"; break; case Manul: result = "Погладь кота, . "; break; >textViewInfo.setText(result); >
Метод values()
Автоматически предопределённый метод для перечисления values() возвращает массив, содержащий список констант перечисления.
enum Cat < Leopard, Puma, Lion, Tiger, Manul >public void onClick(View v) < Cat[] allcats = Cat.values(); for(Cat cat : allcats) < System.out.println(cat); >>
Для примера использовалась дополнительная переменная allcats, которой присваивается ссылка на массив перечислимых значений. Можно обойтись без дополнительной переменной.
for(Cat cat : Cat.values())
Метод valueOf(String string)
Автоматически предопределённый метод для перечисления valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре.
enum Cat < Leopard, Puma, Lion, Tiger, Manul >public void onClick(View v)
Так как перечисление в Java — это тип класса, то вы можете использовать конструкторы, добавлять переменных экземпляров, методы и интерфейсы. Следует сказать, что в Android сначала не рекомендовалось использовать перечисления из-за большого потребления памяти. Сейчас вроде это ограничение сняли, но тем не менее пока перечисления не так широко используются в приложениях для мобильных устройств, поэтому подробно разбирать все возможности перечисления не будем.
Метод ordinal()
У перечислений есть несколько удобных методов. Например, вы можете получить значение, которое указывает позицию константы в списке констант перечисления (порядковое значение или ordinal value), с помощью метода ordinal(). Порядковые значения начинаются с нуля.
for(Cat cat : Cat.values())
Методы compareTo() и equals()
Также можно сравнивать порядковые значения констант одного и того же перечисления с помощью метода compareTo(). Или сравнить на эквивалентность через метод equals().
Увлекаться не стоит из-за большого потребления памяти. Сравним.
// занимает 1112 байт public static enum Things < THING_1, THING_2 >; // другой вариант, занимает 128 байт public static int THING_1 = 0; public static int THING_2 = 1;
По этой причине на сегодняшний день в Android рекомендуется избегать enum. Хотя в последнее время я встречал использование перечислений в исходных кодах Android.
Как из строки (string) сделать enum в java
Есть описание цветов в enum, при замене string данные enum клипс начинает ругаться. Я нагною что можно заменить подогнать в ручную, но есть способ как сделать из переменной string enum. Подскажите ПЛЗ.
Отслеживать
3,072 2 2 золотых знака 12 12 серебряных знаков 21 21 бронзовый знак
задан 16 ноя 2020 в 16:27
Anatoliy-Abashin Anatoliy-Abashin
9 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
this.colour = Colour.valueOf(colour);
Отслеживать
ответ дан 16 ноя 2020 в 16:47
Sergey Gornostaev Sergey Gornostaev
66.4k 6 6 золотых знаков 51 51 серебряный знак 112 112 бронзовых знаков
Спасибо, но не очень понятно в какую часть это вставить.
16 ноя 2020 в 19:06
В конструктор вставить, вместо this.color = color
19 ноя 2020 в 15:49
- java
- enum
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Что такое перечисления в Java? (java enum)
Перечисление или java enum – это набор именованных констант, который помогает в определении своих собственных типов данных. Когда вы можете определить тип переменных в программе, становится легко их определить.
Перечисление – это в основном список именованных констант. В Java это определяет тип класса. Он может иметь конструкторы, методы и переменные экземпляра. Он создается с помощью ключевого слова enum. По умолчанию каждая константа перечисления имеет вид.
Хотя перечисление определяет тип класса и имеет конструкторы, вам не нужно создавать экземпляр перечисления с помощью новой переменной. Переменные перечисления используются и объявляются так же, как переменные примитива.
Объявление enum может быть сделано вне Класса или внутри Класса. Но мы не можем объявить Enum внутри метода. Давайте рассмотрим небольшой пример, чтобы понять его декларацию.
1. Объявление перечисления в Java вне класса
enum Directions < // enum keyword is used instead of class keyword NORTH, SOUTH, EAST, WEST; >public class enumDeclaration < public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>
EAST
2. Объявление перечисления в Java внутри класса
public class enumDeclaration < enum Directions< NORTH, SOUTH, EAST, WEST; >public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>
EAST
Первая строка внутри типа enum должна быть списком констант. Затем вы можете использовать методы, переменные и конструктор. По сути, enum представляет группу переменных и констант.
- Enum в Java в основном улучшает безопасность типов.
- Его можно по-разному использовать в примерах переключения.
- Enum может быть легко пройден.
- Перечисление имеет поля, конструкторы и методы.
- Enum в основном реализует много интерфейсов, но не может расширять какой-либо класс, потому что он внутренне расширяет класс Enum.
Перечисление с использованием оператора Switch
Значение перечисления также может использоваться для управления оператором switch. Необходимо, чтобы все операторы case использовали константы из того же перечисления, что и оператор switch. Ниже пример демонстрирует то же самое.
package Edureka; import java.util.*; enum Directions < NORTH, SOUTH, EAST, WEST >public class Test1< public static void main(String[] args) < Directions d= Directions.SOUTH; switch(d) < //The name of the enumertion constants are used without their enumeration case NORTH: //only constants defined under enum Directions can be used System.out.println("North direction"); break; case SOUTH: System.out.println("South direction"); break; case EAST: System.out.println("East directiion"); break; case WEST: System.out.println("West directiion"); break; >
South Direction
Values() и метод ValueOf()
Values(): при создании enum компилятор Java внутренне добавляет метод values(). Этот метод возвращает массив, содержащий все значения перечисления.
public static enum-type[ ] values()
ValueOf(): этот метод используется для возврата константы перечисления, значение которой равно строке, переданной в качестве аргумента при вызове этого метода.
public static enum-type valueOf (String str)
Теперь давайте напишем программу, чтобы понять эти методы более подробно.
enum Colors < black, red blue, pink, white >class Test < public static void main(String args[]) < Colors c; System.out.println("All constants of enum type Colors are:"); Colors cArray[] = Colors.values(); //returns an array of constants of type Colors for(Colors a : cArray) //using foreach loop System.out.println(a); c = Colors.valueOf("red"); System.out.println("I Like" + c); >>
All constants of enum type Colors are: black red blue pink white I Like red
Вот как вы можете использовать метод Values(), чтобы вернуть массив, содержащий все перечисления, присутствующие в методе, и Valueof(), чтобы вернуть константу перечисления.
Перечисление с помощью конструктора, переменной экземпляра и метода
По сути, перечисление может содержать конструктор и выполняется отдельно для каждой константы перечисления во время загрузки класса перечисления. Кроме того, перечисление может создавать конкретные методы.
enum Student < mack(11), Birdie(10), Son(13), Victor(9); private int age; //variable defined in enum Student int getage < return age; >//method defined in enum Student public Student(int age) //constructor defined in enum < this.age= age; >> class EnumDemo < public static void main( String args[] ) < Student S; System.out.println("Age of Victor is " +Student.Victor.getage()+ "years"); >>
Age of Victor is 9 years
Здесь, как только мы объявляем переменную enum(), конструктор вызывается один раз, и он инициализирует параметр age для каждой константы перечисления значениями, указанными в скобках.
Что нужно знать?
1). Перечисления в Java являются типобезопасными и имеют собственное пространство имен. Это означает, что ваше перечисление будет иметь тип, например «Валюта» в приведенном ниже примере, и вы не можете присвоить какое-либо значение, кроме указанного в константах перечисления.
public enum Currency < PENNY, NICKLE, DIME, QUARTER >; Currency coin = Currency.PENNY; coin = 1; //compilation error
2). Enum в Java – это ссылочные типы, такие как класс или интерфейс, и вы можете определить конструктор, методы и переменные внутри, что делает его более мощным, чем Enum в C и C ++, как показано в следующем примере.
3). Вы можете указать значения констант перечисления во время создания, как показано в примере ниже:
public enum Currency ;
Но для этого вам необходимо определить переменную-член и конструктор, потому что PENNY (1) фактически вызывает конструктор, который принимает значение int, см. Пример ниже.
public enum Currency < PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; private Currency(int value) < this.value = value; >>;
Конструктор должен быть закрытым, любой другой модификатор доступа приведет к ошибке компиляции. Теперь, чтобы получить значение, связанное с каждой монетой, вы можете определить общедоступный метод getValue() внутри перечисления Java, как любой обычный класс. Кроме того, точка с запятой в первой строке не обязательна.
4) Константы перечисления неявно статичны и окончательны и не могут быть изменены после создания. Например, приведенный ниже код приведет к ошибке компиляции:
Currency.PENNY = Currency.DIME;
Последнее поле EnumExamples.Currency.PENNY нельзя переназначить.
5) Может использоваться в качестве аргумента в операторе switch и с «case:», например, с примитивным типом int или char. Эта особенность делает их очень полезными для операций переключения. Давайте посмотрим, как использовать enum внутри оператора switch:
Currency usCoin = Currency.DIME; switch (usCoin)
Поскольку константы, определенные внутри Enum, являются окончательными, вы можете безопасно сравнивать их, используя «==», оператор равенства, как показано в следующем примере:
Currency usCoin = Currency.DIME; if(usCoin == Currency.DIME)< System.out.println("enum in java can be compared using = EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="eclipse">for(Currency coin: Currency.values()) < System.out.println("coin: " + coin); >And it will print: coin: PENNY coin: NICKLE coin: DIME coin: QUARTER
8). Он также может переопределять методы. Давайте посмотрим на пример переопределения метода toString() внутри Enum, чтобы предоставить содержательное описание для констант перечислений.
public enum Currency < . @Override public String toString() < switch (this) < case PENNY: System.out.println("Penny: " + value); break; case NICKLE: System.out.println("Nickle: " + value); break; case DIME: System.out.println("Dime: " + value); break; case QUARTER: System.out.println("Quarter: " + value); >return super.toString(); > >;
А вот как это выглядит при отображении:
Currency usCoin = Currency.DIME; System.out.println(usCoin); Output: Dime: 10
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 интерфейс. Давайте посмотрим и пример того, как реализовать интерфейс:
public enum Currency implements Runnable < PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; . @Override public void run() < System.out.println("Enum in Java implement interfaces"); >>
13). Вы можете определить абстрактные методы внутри Enum, а также можете предоставить другую реализацию для разных экземпляров. Давайте посмотрим на пример использования абстрактного метода внутри.
public enum Currency < PENNY(1) < @Override public String color() < return "copper"; >>, NICKLE(5) < @Override public String color() < return "bronze"; >>, DIME(10) < @Override public String color() < return "silver"; >>, QUARTER(25) < @Override public String color() < return "silver"; >>; private int value; public abstract String color(); private Currency(int value) < this.value = value; >>
В этом примере, поскольку каждая монета будет иметь разный цвет, мы сделали метод color() абстрактным и позволили каждому экземпляру Enum определять свой собственный цвет. Вы можете получить цвет любой монеты, просто вызвав метод color(), как показано в примере ниже:
System.out.println("Color: " + Currency.DIME.color());
Средняя оценка 4.7 / 5. Количество голосов: 25
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
