Kwert-soft.ru

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

Enum valueof java

Перечисления enum

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

Перечисления создаются с использованием ключевого слова enum. Создадим перечисление семейства кошачьих:

Идентификаторы в фигурных скобках называются константами перечисления. Каждый из них явно объявлен как открытый статический финальный член класса Cat. Объявив перечисление, вы можете создавать переменные этого типа. Но делать это нужно без оператора new, а в упрощенном виде. Объявим переменную manul перечислимого типа Cat.

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

Обратите внимание, что во время присваивания вы указываете и тип Cat.

Использование перечисляемых переменных позволят избежать ошибок. Например, мы хотим использовать только числа 1, 2, 3 и такой способ не позволит использовать числа 0, 5, 9 и т.д.

Перечислимые константы можно проверить на равенство:

Также их можно применять в конструкции switch, где у операторов case используются константы из перечисления enum. При этом имена констант используются без имени типа перечисления.

Метод values()

Автоматически предопределённый метод для перечисления values() возвращает массив, содержащий список констант перечисления.

Для примера использовалась дополнительная переменная allcats, которой присваивается ссылка на массив перечислимых значений. Можно обойтись без дополнительной переменной.

Метод valueOf(String string)

Автоматически предопределённый метод для перечисления valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре.

Так как перечисление в Java — это тип класса, то вы можете использовать конструкторы, добавлять переменных экземпляров, методы и интерфейсы. Следует сказать, что в Android сначала не рекомендовалось использовать перечисления из-за большого потребления памяти. Сейчас вроде это ограничение сняли, но тем не менее пока перечисления не так широко используются в приложениях для мобильных устройств, поэтому подробно разбирать все возможности перечисления не будем.

Метод ordinal()

У перечислений есть несколько удобных методов. Например, вы можете получить значение, которое указывает позицию константы в списке констант перечисления (порядковое значение или ordinal value), с помощью метода ordinal(). Порядковые значения начинаются с нуля.

Методы compareTo() и equals()

Также можно сравнивать порядковые значения констант одного и того же перечисления с помощью метода compareTo(). Или сравнить на эквивалентность через метод equals().

Увлекаться не стоит из-за большого потребления памяти. Сравним.

По этой причине на сегодняшний день в Android рекомендуется избегать enum. Хотя в последнее время я встречал использование перечислений в исходных кодах Android.

Attaching Values to Java Enum

Last modified: December 24, 2019

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

In the 9 years of running Baeldung, I’ve never, ever done a «sale».
But. we’ve also not been through anything like this pandemic either.
And, if making my courses more affordable for a while is going to help a company stay in business, or a developer land a new job, make rent or be able to provide for their family — then it’s well worth doing.
Effective immediately, all Baeldung courses are 33% off their normal prices!
You’ll find all three courses in the menu, above, or here.

1. Introduction

The Java enum type provides a language-supported way to create and use constant values. By defining a finite set of values, the enum is more type-safe than constant literal variables like String or int.

However, enum values are required to be valid identifiers, and we’re encouraged to use SCREAMING_SNAKE_CASE by convention.

Given those limitations, the enum value alone is not suitable for human-readable strings or non-string values.

In this tutorial, we’ll use the enum‘s features as a Java class to attach the values we want.

Further reading:

A Gu >A quick and practical guide to the use of the Java Enum implementation, what it is, what problems it solves and how it can be used to implement commonly used design patterns.

Iterating over Enum Values in Java

A Gu >Learn the basics about constructors in Java as well as some advanced tips

2. Using Java Enum as a >

We often create an enum as a simple list of values. For example, here are the first two rows of the periodic table as a simple enum:

Using the syntax above, we’ve created ten static, final instances of the enum named Element. While this is very efficient, we have only captured the element symbols. And while the upper-case form is appropriate for Java constants, it’s not how we normally write the symbols.

Furthermore, we’re also missing other properties of the periodic table elements, like the name and atomic weight.

Although the enum type has special behavior in Java, we can add constructors, fields, and methods as we do with other classes. Because of this, we can enhance our enum to include the values we need.

3. Adding a Constructor and a Final Field

Let’s start by adding the element names. We’ll set the names into a private final variable using a constructor:

First of all, we notice the special syntax in the declaration list. This is how a constructor is invoked for enum types. Although it’s illegal to use the new operator for an enum, we can pass constructor arguments in the declaration list.

We then declare an instance variable label. There are a few things to note about that.

Firstly, we chose the label identifier instead of the name. Although the member field name is available to use, let’s choose label to avoid confusion with the predefined Enum.name() method.

Secondly, our label field is final. While fields of an enum do not have to be final, in the majority of cases we don’t want our labels to change. In the spirit of enum values being constant, this makes sense.

Finally, the label field is public. Hence, we can access the label directly:

On the other hand, the field can be private, accessed with a getLabel() method. For the purpose of brevity, this article will continue to use the public field style.

4. Locating Java Enum Values

Java provides a valueOf(String) method for all enum types. Thus, we can always get an enum value based on the declared name:

However, we may want to look up an enum value by our label field as well. To do that we can add a static method:

The static valueOfLabel() method iterates the Element values until it finds a match. It returns null if no match is found. Conversely, an exception could be thrown instead of returning null.

Let’s see a quick example using our valueOfLabel() method:

5. Caching the Lookup Values

We can avoid iterating the enum values by using a Map to cache the labels. To do this, we define a static final Map and populate it when the class loads:

As a result of being cached, the enum values are iterated only once, and the valueOfLabel() method is simplified.

As an alternative, we can lazily construct the cache when it is first accessed in the valueOfLabel() method. In that case, map access must be synchronized to prevent concurrency problems.

6. Attaching Multiple Values

The Enum constructor can accept multiple values. To illustrate, let’s add the atomic number as an int and the atomic weight as a float:

Similarly, we can add any values we want to the enum, such as the proper case symbols, “He”, “Li”, and “Be”, for example.

Moreover, we can add computed values to our enum by adding methods to perform operations.

7. Controlling the Interface

As a result of adding fields and methods to our enum, we’ve changed its public interface. Therefore, our code, which uses the core Enum name() and valueOf() methods, will be unaware of our new fields.

The static valueOf() method is already defined for us by the Java language. Therefore, we can’t provide our own valueOf() implementation.

Similarly, because the Enum.name() method is final, we can’t override it either.

As a result, there’s no practical way to utilize our extra fields using the standard Enum API. Instead, let’s look at some different ways to expose our fields.

7.1. Overr >

Overriding toString() may be an alternative to overriding name():

By default, Enum.toString() returns the same value as Enum.name().

7.2. Implementing an Interface

The enum type in Java can implement interfaces. While this approach is not as generic as the Enum API, interfaces do help us generalize.

Let’s consider this interface:

For consistency with the Enum.name() method, our label() method does not have a get prefix.

And, because the valueOfLabel() method is static, we do not include it in our interface.

Finally, we can implement the interface in our enum:

One benefit of this approach is that the Labeled interface can be applied to any class, not just enum types. Instead of relying on the generic Enum API, we now have a more context-specific API.

8. Conclusion

In this article, we’ve explored many features of the Java Enum implementation. By adding constructors, fields, and methods, we see that the enum can do a lot more than literal constants.

As always, the full source code for this article can be found over on Github.

How to get an enum value from a string value in Java?

Say I have an enum which is just

and I would like to find the enum value of a string, for example «A» which would be Blah.A . How would it be possible to do this?

Is the Enum.valueOf() the method I need? If so, how would I use this?

27 Answers 27

Yes, Blah.valueOf(«A») will give you Blah.A .

Note that the name must be an exact match, including case: Blah.valueOf(«a») and Blah.valueOf(«A «) both throw an IllegalArgumentException .

The static methods valueOf() and values() are created at compile time and do not appear in source code. They do appear in Javadoc, though; for example, Dialog.ModalityType shows both methods.

Another solution if the text is not the same to the enumeration value:

Here’s a nifty utility I use:

Then in my enum class I usually have this to save some typing:

If your enums are not all caps, just change the Enum.valueOf line.

Too bad I can’t use T.class for Enum.valueOf as T is erased.

Use the pattern from Joshua Bloch, Effective Java:

(simplified for brevity)

You should also be careful with your case. Let me explain: doing Blah.valueOf(«A») works, but Blah.valueOf(«a») will not work. Then again Blah.valueOf(«a».toUpperCase(Locale.ENGLISH)) would work.

edit
Changed toUpperCase to toUpperCase(Locale.ENGLISH) based on tc. comment and the java docs

edit2 On android you should use Locale.US , as sulai points out.

Here’s a method that can do it for any Enum, and is case insensitive.

Using Blah.valueOf(string) is best but you can use Enum.valueOf(Blah.class, string) as well.

In Java 8 or later, using Streams:

If you don’t want to write your own utility use Google’s guava library:

Unlike the built in java function it let’s you check if A is present in Blah and doesn’t throw an exception.

My 2 cents here: using Java8 Streams + checking an exact string:

Renamed the function to fromString() since naming it using that convention, you’ll obtain some benefits from Java language itself; for example:

You may need to this :

One More Addition :

This will return you the Value by a Stringified Enum Name For e.g. if you provide «PERSON» in the fromEnumName it’ll return you the Value of Enum i.e. «Person»

Another way of doing this by using implicit static method name() of Enum. name will return the exact string used to create that enum which can be used to check against provided string:

Solution using Guava libraries. Method getPlanet () is case insensitive, so getPlanet («MerCUrY») will return Planet.MERCURY.

In Java 8 the static Map pattern is even easier and is my preffered method. If you want to use the Enum with Jackson you can override toString and use that instead of name, then annotate with @JsonValue

To add to the previous answers, and address some of the discussions around nulls and NPE I’m using Guava Optionals to handle absent/invalid cases. This works great for URI/parameter parsing.

O(1) method inspired from thrift generated code which utilize a hashmap.

Enum is very useful, I have been using Enum a lot to add a description for some fields in different languages, as the following example:

And then you can retrieve the description dynamically based in the language code passed to getDescription(String lang) method, for example:

java.lang.Enum defines several useful methods, which is available to all enumeration type in Java:

  • You can use name() method to get name of any Enum constants. String literal used to write enum constants is their name.
  • Similarly values() method can be used to get an array of all Enum constants from an Enum type.
  • And for the asked question, you can use valueOf() method to convert any String to Enum constant in Java, as shown below.

In this code snippet, valueOf() method returns an Enum constant Gender.MALE, calling name on that returns «MALE» .

Apache’s commons-lang library has a static function org.apache.commons.lang3.EnumUtils.getEnum which will map a String to your Enum type. Same answer essentially as Geoffreys but why roll your own when it’s out there in the wild already.

Adding on to the top rated answer, with a helpful utility.

valueOf() throws two different Exceptions in cases where it doesn’t like its input.

If your requirements are such that you don’t have any guarantee that your String will definitely match an enum value, for example if the String data comes from a database and could contain old version of the enum, then you’ll need to handle these often.

So here’s a reusable method I wrote which allows us to define a default Enum to be returned if the String we pass doesn’t match.

Use it like this:

As a switch -version has not been mentioned yet I introduce it (reusing OP’s enum):

Since this don’t give any additional value to the valueOf(String name) method, it only makes sense to define an additional method if we want have a different behavior. If we don’t want to raise an IllegalArgumentException we can change the implementation to:

By providing a default value we keep the contract of Enum.valueOf(String name) without throwing an IllegalArgumentException in that manner that in no case null is returned. Therefore we throw a NullPointerException if the name is null and in case of default if defaultValue is null . That’s how valueOfOrDefault works.

This approach adopts the design of the Map -Interface which provides a method Map.getOrDefault(Object key, V defaultValue) as of Java 8.

Another utility capturing in reverse way. Using a value which identify that Enum, not from its name.

Enum-Всемогущий

Вводная

Предостережение

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

Не рассказанная история.

Однажды попадает разработчик в место, где решают судьбу. Время спустя, перед ним появляется образ и спрашивает:
— Кто ты?
— Я, разработчик, звать Иван, — а про себя: Во встрял то.
Голос опять:
— Хочешь туда?. Взгляд на дверь, за которой рай.
— Ага, — робко Иван.
— Чего поведаешь мне?, — спрашивает Голос.
Немного подумав, Иван начинает говорить:
— Есть в java Enum-Всемогущий.
— Как так, Всемогущий? — перебивает Голос с возмущением. — Это только перечисление!

— Ага, — отвечает разраб, Но не только.
— Докажи!
— Enum как гвозди, утильным могёт.

— Во так чудеса, но… Наследника у него нет!
— А это как посмотреть. А кого считать Наследником? Scala? Kotlin?
— Давай пример, не дожидаясь пока разраб завершит свой вопрос

— Да уж, интересные Вы ребята, прогеры — уже улыбаясь, говорит Голос, — Но малова-то будет
Почесав репу, Иван продолжил:
— Enum-то у нас фабрика!
— Не, было уже.
Пришлось, Ивану последний козырь достать:
— Enum-Синглтон, точно!

Выбери свое

— Джошуа Блох говорит*, что это лучшая реализация Синглтона.
— Ну а ты?
— А что я? Это, это — это синглтон-фабрика, для хранения одного единственного элемента, тить колотить.

Это точка для доступа к массиву для хранения одного единственного элемента, тить колотить.

Это наследник класса . , — хотел было продолжить Иван, но был приятно удивлен:
— Проходи.

Немного выводов

Итого получается, что enum можно наделить следующими качествами и свойствами, в зависимости от точки обзора:

  • Перечисление и данные
  • Каркас для утилитного класса
  • Каркас для синглтона класса + антипатерн прилагается
  • Каркас для фабрики

Эксперимент

Я решил понять, сколько можно максимально сгенерировать элементов перечислений. Мой собственный ответ и реальность настолько разошлись, что я усомнился в своих знаниях. Прежде чем Вы посмотрите ниже, попытайтесь дать ответ самостоятельно. Упростим, скажите хотя бы порядок? Вот код, который я использовал для генерации класса перечислений (на быструю руку):

Вы уже предположили? Так вот, на семерочке мне удалось сгенерировать всего 2746 элементов перечислений. А дальше вот это:

Но, так как я раскатал губу в 4 этажа, сначала я получил такую ошибку:

Читать еще:  Исправление пунктуационных ошибок в тексте онлайн
Ссылка на основную публикацию
Adblock
detector