powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как выбрать Enum
11 сообщений из 11, страница 1 из 1
Как выбрать Enum
    #38871442
Марс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: есть база, в ней сущности, у сущностей айдентити (BigInteger). Есть Enum из нескольких из этих сущностей
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
package enums;

import java.math.BigInteger;

public enum MyBigIntEnum {
    ONE(BigInteger.valueOf(1L)),
    TWO(BigInteger.valueOf(2L)),
    THREE(BigInteger.valueOf(3L));
    private BigInteger id;

    private MyBigIntEnum(BigInteger bigInteger) {
        id = bigInteger;
    }
    public BigInteger getId(){
        return id;
    }
    public boolean equals(BigInteger id){
       return this.id.equals(id);
    }
  
}



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

Вопрос 1)какие способы сделать это есть кроме итерации по values() в поисках нужного айдишника?
2)Читал про valueOf в контексте MyBigIntEnum.valueOf("THREE") но так и не понял зачем оно надо - сугубо для случаев когда имя енама совпадает с идентификатором во внешнем коде?
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38871490
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марс1)какие способы сделать это есть кроме итерации по values() в поисках нужного айдишника?
если id совпадает с порядковым номером соотв. энума (ordinal), то можно по нему, но это очень порочный подход. однажды кто-то отсортирует энумы или поменяет id по-другому и приплыли. пробегать по values - единственно верный способ. что смущает то, один for написать?

Марс2)Читал про valueOf в контексте MyBigIntEnum.valueOf("THREE") но так и не понял зачем оно надоесли у тебя в базе или коде каким-то чудом строковое представление этих значений. короче всегда, когда они приходят из такого места, где у тебя нет контроля над форматом.
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38871609
Марс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто смущает то, один for написать Ну думал может что то покрасивше есть, всё-таки кейс не очень редкий. Потом подумал что это правильно потому что позволяет поиск по нескольким ключам
авторкороче всегда, когда они приходят из такого места, где у тебя нет контроля над форматом. Не понял - если у меня нет контроля над форматом то как получится что пришедшие значения будут 1 в 1 совпадать с названиями в enum - это кажется лишь чуть менее порочным чем завязываться на порядок значений в енаме.
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38871641
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МарсНе понял - если у меня нет контроля над форматом то как получится что пришедшие значения будут 1 в 1 совпадать с названиями в enum
ну энум-то ты создаешь, делаешь так, что значения соответствуют тому, что тебе выплевывает, например, веб-сервис.

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

p.s.
в принципе если есть роскошь юзать java 7+, то энум может и не нужен, если все его применение ограничивается switch
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38871969
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марс,
c Google Guava
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
.....
private BigInteger id;

private static ImmutableMap<BigInteger,MyBigIntEnum> valuesById = ImmutableMap.of(ONE.getId(),ONE,TWO.getId(),TWO,....);
.....
public static MyBigIntEnum valueOf(BigInteger id){
   return valuesById.get(id);
}
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38873501
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МарсНу думал может что то покрасивше есть
Если есть дырки, то Двоичный поиск вестимо. Можно еще и не пополам делить ...
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38873650
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевМожно еще и не пополам делить ...
что, все три значения :) ? если в энуме больше десятка элементов, то что-то сильно не так в консерватории. а если меньше, то о каком бинарном поиске и хэшмэпах может идти речь? я думаю автора вопроса волновала эстетическая сторона реализации, а не просадки в производительности.
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38874982
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Если мы говорим про три элемента, то хватит одного switch(TWO.compareTo(...)) (вот и весь двоичный поиск), сомневаюсь, что этот вариант сильно просадит производительность по сравнению с for(...).

Но эстетика -великая сила, на вкус и цвет у всех помидоры разные.

По поводу количества элементов в enum - то если используется BigInteger, то видать неспроста.
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38874998
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев По поводу количества элементов в enum - то если используется BigInteger, то видать неспроста.
причина весьма банальна, цитирую

авторесть база, в ней сущности, у сущностей айдентити (BigInteger). Есть Enum из нескольких из этих сущностей
так что в энуме мог бы быть byte, а не BigInteger, автор просто хочет избежать приведения типов, вряд ли он хранит энумы количеством более Integer.MAX_VALUE ;)
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38875038
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Ну и где будет просадка производительности?

На 3х элементах (с вариантом поиска по левому id) -
полный перебор - 1-3 equals
двоичный поиск - switch(compareTo()) и возможно equals

На 10 элементах
полный перебор - 1-10 equals
двоичный поиск - 1-2 switch(compareTo()) и 0-2 equals

Просто не надо считать, что двоичный поиск это меганавороченный алгоритм. Нам же не надо сортировать enum - это можно сделать заранее (до компиляции).
...
Рейтинг: 0 / 0
Как выбрать Enum
    #38875096
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев
Ну и где будет просадка производительности?
скорее всего в нигде, если метод не вызывается миллион раз в цикле.

Сергей АрсеньевПросто не надо считать, что двоичный поиск это меганавороченный алгоритм
просто не надо
а) заниматься преждевременной оптимизацией
б) писать трудно читаемый код в угоду этой преждевременной оптимизации.

Сергей Арсеньев. Нам же не надо сортировать enum - это можно сделать заранее (до компиляции).
еще раз, мы сейчас на полном серьезе обсуждаем ручную сортировку и бинарный поиск по 3 элементам?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как выбрать Enum
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]