Чи краще використовувати рядки або int для посилання на enums за межами java частини системи?


11

Ми обговорювали мою роботу щодо використання переліків на Java.

Співробітник стверджував, що при використанні переписок на стороні сервера, коли потрібно, ми повинні використовувати рядок для посилання на нього (наприклад, при надсиланні даних з JS на сервер або при зберіганні в базі даних), стверджуючи, що це набагато зрозуміліше для розробника, а також стверджуючи, що це швидко вийде з ладу у випадку помилок.

Я завжди використовував цілі числа для ідентифікації переліків у цих випадках, тому що це були б незмінні ідентифікатори і не мали б проблем із випадками та помилками друку (навіть якщо девіз помилився, використовуючи значення 2 замість 1, воно не вийшло б швидко).

Будучи дуже аналітичним щодо цих аргументів, я б сказав, що використовувати рядки краще, але я маю дивне відчуття з цього приводу (ніби це не гарний підхід).

Чи є найкраща практика щодо цієї дискусії, яка могла б мене направити?

Редагувати: Коли це можливо, ми використовуємо сам enum, тому весь наш код Java використовує Enum. Під "посиланням на enum" я маю на увазі: посилання на значення в enum при обміні даними з JavaScript на сервері або зберіганні даних у базі даних


1
Що для вас є "посиланням на енму"? Нормальне використання у вихідному коді? Серіалізація для зберігання в базі даних? Вираз для використання в документації користувача? Вираз для використання в технічній документації? Відповідь буде абсолютно різною для всіх.
Кіліан Фот

Я відредагував це питання, і я сподіваюся, що це зараз зрозуміліше: під посиланням на enum я маю на увазі посилання на значення при обміні даними з JavaScript на Сервер чи навпаки або зберіганні значення в базі даних
JSBach

У API JavaScript я б точно використовував рядки. У БД обидва мають свої переваги. Деякі бази даних мають вбудовану підтримку enum.
CodesInChaos

Відповіді:


15

Хороше питання. Використання enum в Java в першу чергу призначене для обробки інформації, яка є дещо категоричною за своєю суттю. Класичний приклад використання enum для обробки чотирьох типів костюмів, які може мати карта. Це забезпечує всі переваги продуктивності використання цілого числа, і це також зрозуміло у вашій програмі.

Тож поза Явою, чому б ви не продовжували використовувати ціле число? Можливо, у вас немає типів enum за межами Java, хоча це не означає, що ви не можете продовжувати використовувати цілі числа для цілей продуктивності, правда? Так, це абсолютно вірно, хоча врахуйте, що станеться, коли ви додасте нове значення перерахунку. Якщо ви не додасте його до кінця, всі інші значення перерахунків після нового значення будуть збільшені на одиницю. Ми просто вкажемо число, щоб воно не могло змінитися, або ми завжди додамо його до кінця. Ви впевнені, що ваші колеги-колеги завжди будуть робити це правильно? Мех? Мабуть? Сподіваємось? Можливо, ви не на 100% з цього приводу. Майте це на увазі на секунду.

Ваш начальник каже вам, що у клієнта, що використовує ваше програмне забезпечення після останнього оновлення, виникає безлад. Тепер усі об'єкти X діють так, як їм присвоєно значення Y enum, навіть якщо вони дійсно були призначені Z. Ви перевіряєте сховище, і так, хтось додав нове значення enum і не дотримувався ваших вказівок, як ви їх просили. Тепер у вас є додаткове ускладнення, що в базі даних написано 4, коли насправді повинно бути 3, за винятком записів, вставлених до оновлення, які насправді є 4. Яке значення перерахунку відноситься до 4 у будь-якому випадку? Чи не так? Ви не можете згадати. Для перевірки потрібно перевірити програму. Простіше кажучи, це безлад.

Якщо натомість у вашій базі даних написано «СЛУХИ», «ДІАМОНТИ», «СПАДИ», «КЛУБИ», ви втратили мало місця та просто так багато набрали. Це правда, що ми говоримо про незначне враження від продуктивності, але ви дійсно не повинні мати доступ до бази даних, яка часто має значення. Що стосується місця, залиште це системним адміністраторам (не ваша проблема.).

Якщо ви створили просту програму, в яку легко вносити зміни, ви зробили собі послугу в перспективі, повірте мені. Цей її аспект не відрізняється на мою скромну думку.


2
Хороші бали, але ви забуваєте про випадок, коли хтось вирішує змінити ім’я одного із сукупностей переліків ( HEARTSна Heartчи щось у вашому прикладі) і раптом все знову зламається.
Скотт Вітлок

1
@ScottWhitlock Не якщо ви це врахуєте, хоча вони могли вирішити цілком перейменувати його. Вони можуть випадково видалити базу даних і також видалити проект, але ми не можемо пояснити всі можливі випадки тут.
Ніл

5
@Neil - правда, але тут ми намагаємось зіграти шанси. Я не знайомий з перерахунками Java, але в C # я чітко встановлюю значення для переліків, якщо значення повинні мати значення поза програмою (наприклад, у базі даних) (наприклад, Hearts = 1, Diamonds = 2 тощо) . Оскільки це не типовий спосіб використання enum, він повинен дати пізнішій редакторі паузи. Плюс коментар, зазначаючи, де ще вони використовуються, зручно.
Скотт Вітлок

1
@ScottWhitlock Це, безумовно, кращий спосіб зробити це, щоб уникнути подібних проблем. Хоча припустимо, що ви це зробили, ви все ще бачите 1, 2, 3, 4 в базі даних або серіалізуються в якомусь файлі. Не ідеально з точки зору обслуговування будь-яким способом, коли ви його нарізаєте.
Ніл

2
Якщо я можу додати, якщо enum серіалізується як рядок і хтось змінить ім'я enum, під час десеріалізації помилка буде під час розбору. Якщо enum int і хтось змінить визначення, помилка буде надалі вниз під час обробки, що буде важче діагностувати. CC @ScottWhitlock.
Endy Tjahjono

1

Я згоден з відповіддю Ніла, але лише доповненням:

У java enums є Об'єкти, тому вони можуть мати поля та методи. Таким чином, ви можете надати кожному перерахунку певне значення, вручну, і, посилаючись на це для зовнішньої роботи, використовуйте це значення замість цього.

Він переживе як додавання / видалення / упорядкування, так і зміну назви екземпляра enum. Але вам доведеться писати логіку серіалізації / десеріалізації для полів enum, а не використовувати автоматичні, доступні в багатьох інструментах. (Його легка, але додаткова робота).

І ви повинні зберегти ці значення унікальними вручну (але це однаково у переліку стилів C), і ви можете написати тест, щоб перевірити це.


Так, ми пішли цим шляхом, але ми використовуємо сплячий режим, і нам довелося додати додатковий код, щоб можна було проаналізувати значення в / з бази даних, і це виглядало якось дивно, тому ми вирішили використовувати відносини .STRING і піти з ім'ям enum.
JSBach
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.