Отримання значення рядка з переліку в Java


76

У мене є перелік, визначений таким чином, і я хотів би мати можливість отримати рядки для окремих статусів. Як мені писати такий метод?

Я можу отримати значення int статусів, але хотів би також отримати значення рядків з ints.

public enum Status {
    PAUSE(0),
    START(1),
    STOP(2);

    private final int value;

    private Status(int value) {
        this.value = value
    }

    public int getValue() {
        return value;
    }
}

7
Статус s = Статус.ПАУЗА; System.out.println (s.name ());
Нікола Йовчев

Відповідь на це питання допоможе вам зрозуміти stackoverflow.com/questions/17606866 / ...
Прасад Kharkar

2
Замість того, щоб визначити 0,1,2, ви можете використовуватиStatus.ordinal();
Arnaud Denoyelle

2
@ArnaudDenoyelle: Вам слід уникати використання порядкового (), див. Joshua Bloch "Ефективна Java"
GarfieldKlon

1
@GarfieldKlon Я згоден. Я не раджу (і ніколи не буду) покладатися, ordinal()оскільки додавання значення в перерахуванні змінить порядковий порядок кожного переліку. Я хотів зазначити, що ОП повторює ordinal()поведінку Росії.
Arnaud Denoyelle

Відповіді:


112

якщо statusмає тип Statusenum, status.name()дасть вам визначене ім'я.


3
@JoeMaher, toString()схоже, є найкращим способом згідно з офіційною документацією: "Більшість програмістів повинні використовувати метод toString () на відміну від цього, оскільки метод toString може повернути більш зручне ім'я". ( docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#name () )
Карстен,

7
@Carsten status.name()доречний, якщо ви хочете використовувати його в коді (для точності та послідовності), status.toString()доречний, якщо ви хочете показати його користувачеві (для читабельності).
intcreator

50

Ви можете використовувати values()метод:

Наприклад Status.values()[0], у вашому випадку буде повернуто ПАУЗУ, якщо ви її надрукуєте, toString()буде викликано та буде надруковано "ПАУЗА".


Правильно, просто додати Status.values()[0]було б типу Statusні String.
суворий

13

Використовуйте ім'я методу за замовчуванням (), як вказано нижче

public enum Category {
        ONE("one"),
        TWO ("two"),
        THREE("three");

        private final String name;

        Category(String s) {
            name = s;
        }

    }

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Category.ONE.name());
    }
}

1
чому б не замінити toString для повернення імені ??
Mohammed Housseyn Taleb

4
Повертає що? ОДИН або один, є різниця (назва переліку чи його значення)
Меркурій

9

Ви можете додати цей метод до переліку статусу:

 public static String getStringValueFromInt(int i) {
     for (Status status : Status.values()) {
         if (status.getValue() == i) {
             return status.toString();
         }
     }
     // throw an IllegalArgumentException or return null
     throw new IllegalArgumentException("the given number doesn't match any Status.");
 }

public static void main(String[] args) {
    System.out.println(Status.getStringValueFromInt(1)); // OUTPUT: START
}

0

Я вважаю, що enum має .name () в своєму API, досить простий у використанні, як у цьому прикладі:

private int security;
public String security(){ return Security.values()[security].name(); }
public void setSecurity(int security){ this.security = security; }

    private enum Security {
            low,
            high
    }

За допомогою цього ви можете просто зателефонувати

yourObject.security() 

і він повертає високий / низький як String, у цьому прикладі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.