Преобразование строки в элемент enum
Только я получаю его как String, а нужно что бы вернул типа enum PriorityType. Как выкрутиться из этой ситуации?
Отслеживать
23.4k 3 3 золотых знака 50 50 серебряных знаков 70 70 бронзовых знаков
задан 10 апр 2015 в 6:06
duddeniska duddeniska
3,978 17 17 золотых знаков 67 67 серебряных знаков 114 114 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для преобразования строки в элемент enum в каждом enum’е есть метод valueOf :
PriorityType high = PriorityType.valueOf("HIGH");
Этот метод чувствителен к регистру, передаваемая строка должна в точности повторять имя элемента enum’а.
Ещё один вариант, позволяющий кастомизировать строки, на основании которых создаются элементы enum’а. Он строится на основе использования конструктора и реализации своего метода преобразования строки в елемент enum’а:
public enum PriorityType < LOW("LowPrioroty"), MIDDLE("MiddlePrioroty"), HIGH("HighPrioroty"); private String value; private PriorityType(String value) < this.value = value; >public static PriorityType fromString(String value) < if (value != null) < for (PriorityType pt : PriorityType.values()) < if (value.equalsIgnoreCase(pt.value)) < return pt; >> > throw new IllegalArgumentException("No such value"); > > PriorityType low = PriorityType.fromString("lowpriority");
Преобразование Enum в String
Сегодня поговорим о работе со строковыми перечислениями, а конкретнее — с enum классами, в которых организовано взаимодействие со строковыми константами.
Использование строковых перечислений
Во время разработки приложения периодически нужно оперировать фиксированным набором строковых значений. Это может быть что угодно. Например, список цветовых кодов, поддерживаемых приложением, или список устройств с которыми способно взаимодействовать наше приложение, времена года и т.д. Все это — предопределенный набор строковых констант с общей структурой, с которыми необходимо наладить программное взаимодействие на уровне Java кода. Когда необходимо взаимодействовать с предопределенным набором строковых (и не только) констант, лучшее решение — написать свой enum класс. Ниже рассмотрим примеры преобразования enum в string .
Создание строковых перечислений
Создадим enum класс, в котором хранится список различных окружений для развертывания приложения, а также URL каждого окружения:
public enum Environment < PROD("https://release.application.com/"), TEST("https://test.application.com/"), AUTO_TEST("https://autotest.application.com/"), DEV("http://localhost:8080"); private final String url; Environment(String url) < this.url = url; >public String getUrl() < return url; >>
- PROD — релизное
- TEST — для ручного тестирования
- AUTO_TEST — окружение для автотестов
- DEV — локальное для разработки и дебага
- Каждый URL — это строковая константа нашего перечисления: они определяются в скобках у каждой enum константы.
- Обязательно наличие конструктора, принимающего аргумент того же типа, что и каждая enum константа.
- Область видимости конструктора — private либо package private .
- Необходимо определить переменную — поле класса, которое будет хранить определенные нами строковые константы. Для этого поля необходимо создать метод геттер, чтобы использовать значения строковых констант извне.
Перебор строковых перечислений
На данном этапе мы уже можем перебрать все доступные enum значения, а также получить привязанные к ним строковые константы. Чтобы получить все значения любого enum класса, необходимо использовать метод values() :
public class Main < public static void main(String[] args) < for (Environment env : Environment.values()) < System.out.println(env + " : " + env.getUrl()); >> >
Вывод:
PROD : https://release.application.com/ TEST : https://test.application.com/ AUTO_TEST : https://autotest.application.com/ DEV : http://localhost:8080
Как видно из примера, для вывода на печать имени enum константы мы передали ее в метод System.out.println , а для вывода на печать привязанного к данной константе url мы использовали определенный нами геттер.
Получение строковой константы из enum
Для получения значения любой строковой константы мы также можем вызывать геттер у любой enum константы:
public class Main < public static void main(String[] args) < String prodUrl = Environment.PROD.getUrl(); String devUrl = Environment.DEV.getUrl(); System.out.println("Production url is: " + prodUrl); System.out.println("Development url is: " + devUrl); >>
Вывод:
Production url is: https://release.application.com/ Development url is: http://localhost:8080
Получение enum константы по имени
Порой бывает необходимо получить enum константу по ее строковому наименованию. Делается это с помощью метода valueOf(String) , который возвращает константу по ее имени:
public class Main < public static void main(String[] args) < Environment prod = Environment.valueOf("PROD"); Environment dev = Environment.valueOf("DEV"); System.out.println("Production url is: " + prod.getUrl()); System.out.println("Development url is: " + dev.getUrl()); >>
Вывод:
Production url is: https://release.application.com/ Development url is: http://localhost:8080
Но тут нужна осторожность. Если метод не найдет enum константу с указанным именем, будет брошено исключение java.lang.IllegalArgumentException .
Преобразование String в Enum
Иногда возникает обратная потребность. Зная значение enum , получить саму enum константу. Т.е. в нашем примере, зная определенный адрес, нужно получить соответствующую ему Environment константу. Есть несколько вариантов сделать это. И все они требуют доработки в самом enum классе. Вариант 1. Перебор внутри класса. Необходимо создать метод, который будет принимать строку, и сравнивать ее со всеми значениями enum класса. При совпадении метод будет возвращать нужное перечисление. Для нашего примера необходимо внутри класса Environment создать следующий метод:
public static Environment getEnvByUrl(String url) < for (Environment env : values()) < // либо equalsIgnoreCase, на ваше усмотрение if (env.getUrl().equals(url)) < return env; >> // Либо просто вернуть null throw new IllegalArgumentException("No enum found with url: [" + url + "]"); >
Тогда мы сможем получать enum из строки таким образом:
public class Main < public static void main(String[] args) < String url = "http://localhost:8080"; Environment env = Environment.getEnvByUrl(url); System.out.println("Environment name for url=[" + url + "] is: " + env); >>
Environment name for url=[http://localhost:8080] is: DEV
У этого подхода есть свои минусы. Каждый раз для получения enum константы придется перебирать все значения и производить некоторое количество сравнений. Ущерб производительности в таком случае будет определяться количеством констант и количеством подобных операций. У второго способа решения этой задачи такой проблемы нет. Полный код Enum класса:
public enum Environment < PROD("https://release.application.com/"), TEST("https://test.application.com/"), AUTO_TEST("https://autotest.application.com/"), DEV("http://localhost:8080"); private final String url; Environment(String url) < this.url = url; >public String getUrl() < return url; >public static Environment getEnvByUrl(String url) < for (Environment env : values()) < if (env.getUrl().equals(url)) < return env; >> throw new IllegalArgumentException("No enum found with url: [" + url + "]"); > >
Вариант 2. Использование HashMap В этом случае мы создаем карту внутри нашего перечисления и заполняем ее один раз на этапе компиляции, а затем берем из нее значения:
public enum Environment < PROD("https://release.application.com/"), TEST("https://test.application.com/"), AUTO_TEST("https://autotest.application.com/"), DEV("http://localhost:8080"); private final String url; Environment(String url) < this.url = url; >public String getUrl() < return url; >// Создаем static final карту private static final Map LOOKUP_MAP = new HashMap<>(); // Заполняем её всеми значениями static < for (Environment env : values()) < LOOKUP_MAP.put(env.getUrl(), env); >> // Возвращаем Environment по строковому url public static Environment getEnvByUrl(String url) < return LOOKUP_MAP.get(url); >>
В плане использования оба варианта идентичны:
public class Main < public static void main(String[] args) < String url = "http://localhost:8080"; Environment env = Environment.getEnvByUrl(url); System.out.println("Environment name for url=[" + url + "] is: " + env); >>
Environment name for url=[http://localhost:8080] is: DEV
Но и у этого способа есть недостатки. Во-первых, кода стало значительно больше. А во-вторых, HashMap со всеми enum значениями будет храниться в памяти приложения постоянно. Как видим, у всего есть плюсы и минусы. Но учитывая то, что в enum классах обычно хранится не так уж много значений, минусы будут практически незаметны. Есть нюанс: если подобная операция (получение в Java Enum по String значению) выполняется часто, лучше использовать второй вариант. Подробнее с данной темой и Enum классами вообще можно познакомиться на курсе JavaRush. Студенты JavaRush изучают Enum уже на первой лекции пятого уровня.
Как enum преобразовать в string java
enum — Это довольно непростая тема для меня, может вы ребята, порекомендуете какие-либо полезные ссылки для изучения этого класса?)
Максим Li Уровень 36
6 декабря 2023
Хорошая статья
Alexander Rozenberg Уровень 32
18 июля 2023
No Name Уровень 32
11 июня 2023
+ статья в копилку
Ислам Уровень 33
31 мая 2023
Vitya Уровень 33
11 апреля 2023
* Информация для продвинутых юзеров. На самом деле возможно ограниченное наследование от Enum. Подробнее здесь: https://kibungo.livejournal.com/19999.html Пример наследования и переопределения общего метода:
public enum MyEnum < VAL1 < public int returnMyVal()< return 20; >>, VAL2; public int returnMyVal() < return 10; >> ------------------------ System.out.println(MyEnum.VAL1.returnMyVal()) // 20 System.out.println(MyEnum.VAL2.returnMyVal()) // 10
partiec Уровень 33
7 марта 2023
Есть ли какой-то смысл в таком заковыристом переопределении toString()?
Dina Goncharova Уровень 39
21 августа 2022
Хорошая статья. Не теряет своей актуальности. По ней или учишь, или повторяешь. )
1 июля 2022
«По сравнению с обычными классами, на Enum наложили одно серьезное ограничение — от него невозможно наследоваться.» Что за бред вы пишете?! Все перечисления изначально неявно расширяют класс java.lang.Enum, а поскольку в Java нету множественного наследования, то и расширять enum уже больше ничего не может.
Жора Нет Уровень 39
13 мая 2022
В статье enum в коде с маленькой буквы, в комментариях к коду — Enum с большой Почему не говорится, что это разные вещи? Если у нас несколько enum`ов с перечислениями в приложении и нам нужно передать один из них как аргумент в метод можно сделать просто так someMethod(Enum e) < и здесь написать условие для выбора одного из enum`ов >Т.е. не нужно приводить все enum`ы к единому интерфейсу или абстрактному классу, чтобы выбрать один из enum`ов Как я понял Enum(тот который с большой буквы) — это что-то типа пустого интерфейса для всех enum`ов
Java Program to Convert Enum to String
Given an enum containing a group of constants, the task is to convert the enum to a String.
Methods:
We can solve this problem using two methods:
- Using name() Method
- Using toString() Method
Let us discuss both of them in detail and implementing them to get a better understanding of the same.
Method 1: Using name() Method
It returns the name of the enum constant same as declared in its enum declaration.
- We would be using name() method to return the name of the enum constant.
- In the main class, we just have to print it.
- The value given inside is first the name of the enum class that we will create further, then calling the constant that is named, finally using the name() method.
- Now create another java enum file named Fruits.java in the same folder where you created the main file, and declare the enum as follows:
Example
public enum Fruits
Java
// Java Program to Convert Enum to String
// Importing input output classes
import java.io.*;
enum Fruits <
// Main class
// Main driver method
public static void main(String[] args) <
// Printing all the values
System.out.println(Fruits.Orange.name());
System.out.println(Fruits.Apple.name());
System.out.println(Fruits.Banana.name());
System.out.println(Fruits.Mango.name());
Output
Orange Apple Banana Mango
It is used to get a string object which represents the value of the number object.
- We will be following the same procedure as earlier used but the only difference here is that we will be using toString() method. So just replace name() method with toString() method.
Note: Do not forgot to create a Fruits.java enum file in the same folder.
Illustration:
public enum Fruits
Example 2
Java
// Java Program to Convert Enum to String
// Using toString() Method
// Importing input output classes
import java.io.*;
enum Fruits <
// Custom entries
// Main class
class Main <
// Main driver method
public static void main (String[] args) <
// Printing all the values
System.out.println(Fruits.Orange.toString());
System.out.println(Fruits.Apple.toString());
System.out.println(Fruits.Banana.toString());
System.out.println(Fruits.Mango.toString());
Output
Orange Apple Banana Mango
Like Article
Suggest improvement
Share your thoughts in the comments
Add Your Comment
Please Login to comment.
Similar Reads
Converting a String to an Enum in Java
Java Program to Define Ordinal() Method Using Enum Concept
Java Program to Access All the Constant Defined in the Enum
Java.lang.Enum Class in Java
Comparing enum members in Java
Iterating over Enum Values in Java
How to implement an Interface using an Enum in Java
Usage of Enum and Switch Keyword in Java
How to Fix «class, interface, or enum expected» Error in Java with Examples?
Why Enum Class Can Have a Private Constructor Only in Java?
Article Tags :
- Java-Enumeration
- Java-String-Programs
- Java
- Java Programs
Practice Tags :
Explore More
A-143, 9th Floor, Sovereign Corporate Tower, Sector-136, Noida, Uttar Pradesh — 201305
- Company
- About Us
- Legal
- Careers
- In Media
- Contact Us
- Advertise with us
- GFG Corporate Solution
- Placement Training Program
- Explore
- Hack-A-Thons
- GfG Weekly Contest
- DSA in JAVA/C++
- Master System Design
- Master CP
- GeeksforGeeks Videos
- Geeks Community
- Languages
- Python
- Java
- C++
- PHP
- GoLang
- SQL
- R Language
- Android Tutorial
- Tutorials Archive
- DSA
- Data Structures
- Algorithms
- DSA for Beginners
- Basic DSA Problems
- DSA Roadmap
- Top 100 DSA Interview Problems
- DSA Roadmap by Sandeep Jain
- All Cheat Sheets
- Data Science & ML
- Data Science With Python
- Data Science For Beginner
- Machine Learning Tutorial
- ML Maths
- Data Visualisation Tutorial
- Pandas Tutorial
- NumPy Tutorial
- NLP Tutorial
- Deep Learning Tutorial
- HTML & CSS
- HTML
- CSS
- Web Templates
- CSS Frameworks
- Bootstrap
- Tailwind CSS
- SASS
- LESS
- Web Design
- Django Tutorial
- Python Tutorial
- Python Programming Examples
- Python Projects
- Python Tkinter
- Web Scraping
- OpenCV Tutorial
- Python Interview Question
- Computer Science
- Operating Systems
- Computer Network
- Database Management System
- Software Engineering
- Digital Logic Design
- Engineering Maths
- DevOps
- Git
- AWS
- Docker
- Kubernetes
- Azure
- GCP
- DevOps Roadmap
- Competitive Programming
- Top DS or Algo for CP
- Top 50 Tree
- Top 50 Graph
- Top 50 Array
- Top 50 String
- Top 50 DP
- Top 15 Websites for CP
- System Design
- High Level Design
- Low Level Design
- UML Diagrams
- Interview Guide
- Design Patterns
- OOAD
- System Design Bootcamp
- Interview Questions
- JavaScript
- JavaScript Examples
- TypeScript
- ReactJS
- NextJS
- AngularJS
- NodeJS
- Lodash
- Web Browser
- Preparation Corner
- Company-Wise Recruitment Process
- Resume Templates
- Aptitude Preparation
- Puzzles
- Company-Wise Preparation
- School Subjects
- Mathematics
- Physics
- Chemistry
- Biology
- Social Science
- English Grammar
- World GK
- Management & Finance
- Management
- HR Management
- Finance
- Income Tax
- Organisational Behaviour
- Marketing
- Free Online Tools
- Typing Test
- Image Editor
- Code Formatters
- Code Converters
- Currency Converter
- Random Number Generator
- Random Password Generator
- More Tutorials
- Software Development
- Software Testing
- Product Management
- SAP
- SEO — Search Engine Optimization
- Linux
- Excel
- GeeksforGeeks Videos
- DSA
- Python
- Java
- C++
- Data Science
- CS Subjects
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy Got It !
Improvement
Please go through our recently updated Improvement Guidelines before submitting any improvements.
This article is being improved by another user right now. You can suggest the changes for now and it will be under the article’s discussion tab.
You will be notified via email once the article is available for improvement. Thank you for your valuable feedback!
Suggest changes
Please go through our recently updated Improvement Guidelines before submitting any improvements.
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.