У мене є сценарій , в якому у мене є типи гравця ARCHER
, WARRIOR
і sorcerer
.
Що слід використовувати в класі Player для типу гравця?
Постійна остаточна статична змінна рядка чи перелік ? і чому?
Будь ласка, допоможіть з причинами.
У мене є сценарій , в якому у мене є типи гравця ARCHER
, WARRIOR
і sorcerer
.
Що слід використовувати в класі Player для типу гравця?
Постійна остаточна статична змінна рядка чи перелік ? і чому?
Будь ласка, допоможіть з причинами.
Відповіді:
Припустимо, ви використовуєте константи (або int
значення - те саме стосується і них):
// Constants for player types
public static final String ARCHER = "Archer";
public static final String WARRIOR = "Warrior";
// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";
тоді ви в кінцевому підсумку не знаєте тип ваших даних - що призводить до потенційно неправильного коду:
String playerType = Constants.MALE;
Якщо ви використовуєте перелічення, це закінчиться як:
// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;
Аналогічно, перелічення дають обмежений набір значень:
String playerType = "Fred"; // Hang on, that's not one we know about...
проти
PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!
Крім того, перелічення в Java можуть мати більше інформації, пов'язаної з ними, а також можуть мати поведінку. Набагато краще навколо.
Перелічення обмежують вас необхідним набором входів, тоді як навіть якщо ви використовуєте константи, ви все одно можете використовувати інший рядок, який не є частиною вашої логіки.
Це допомагає вам не помилитися, ввести щось поза доменом при введенні даних, а також покращує читабельність програми.
Крім того, ви завжди можете використовувати свої переліки як рядок, якщо хочете. Ось посилання .
Окрім того, що ви не дозволяєте вказати неправильне значення, є ще одна особливість перелічень, яка може здатися незначною, але, на мій погляд, досить важлива. Сучасні середовища розробки середовища можуть автоматично пропонувати значення для перерахувань, хоча немає можливості достовірно вивести можливі значення рядкової константи (Intellij IDEA робить останнє, але лише для класів JDK та популярних бібліотек). Це особливо корисно, коли ви досліджуєте новий API.
Enum краще використовувати для безпеки типу. Неможливо ввести неправильні значення. Але enum в android забирає стільки пам'яті, замість цього слід використовувати intdef. Зверніться до цієї відповіді для прикладу та пояснення: -
Приклад IntDef / StringDef
Ви також можете перевірити вихідний код Android, де він замінює перелічення IntDef / StringDef, де це можливо. Напр. Перегляд. ВИДИМИЙ.
Я порадив би вам використовувати перелічення, лише якщо вам дійсно потрібні перелічені константи або якась додаткова функціональність, загальна для всіх елементів.
Це, звичайно, залежить від типу програми, яку ви пишете, та яких версій та пристроїв ви хочете підтримувати.
Причина в тому, що перелічення додають накладні витрати, оскільки вони виділяють екземпляри своїх елементів. Ви можете помітити, що в платформі android є мінімальне перерахування, і майже всі константи є кінцевими статичними вставками (наприклад, View.GONE і подібні речі)
int
змінна (з приємно названими константами для різних типів).