Nhận giá trị chuỗi từ enum trong Java


76

Tôi có một enum được định nghĩa như thế này và tôi muốn có thể lấy các chuỗi cho các trạng thái riêng lẻ. Làm thế nào tôi nên viết một phương pháp như vậy?

Tôi có thể nhận các giá trị int của các trạng thái nhưng cũng muốn có tùy chọn nhận các giá trị chuỗi từ các int.

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
Trạng thái s = Trạng thái.PAUSE; System.out.println (s.name ());
Nikola Yovchev,

Câu trả lời này sẽ giúp bạn hiểu stackoverflow.com/questions/17606866/...
Prasad Kharkar

2
Thay vì xác định 0,1,2, bạn có thể sử dụngStatus.ordinal();
Arnaud Denoyelle

2
@ArnaudDenoyelle: Bạn nên tránh sử dụng ordinal (), xem Joshua Bloch "Java hiệu quả"
GarfieldKlon

1
@GarfieldKlon Tôi đồng ý. Tôi không (và sẽ không bao giờ) khuyên bạn nên dựa vào ordinal()vì thêm một giá trị trong enum sẽ thay đổi thứ tự của mọi enum. Tôi muốn chỉ ra rằng OP đã sao chép ordinal()hành vi của 's.
Arnaud Denoyelle

Câu trả lời:


112

nếu statusthuộc loại Statusenum, status.name()sẽ cung cấp cho bạn tên được xác định của nó.


3
@JoeMaher toString()dường như là cách ưa thích theo tài liệu chính thức: "Hầu hết các lập trình viên nên sử dụng phương thức toString () thay vì phương thức này, vì phương thức toString có thể trả về một tên thân thiện hơn." ( docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#name () )
Carsten

7
@Carsten status.name()thích hợp nếu bạn muốn sử dụng nó trong mã (vì độ chính xác và nhất quán), status.toString()thích hợp nếu bạn muốn hiển thị nó cho người dùng (để dễ đọc).
intcreator

50

Bạn có thể sử dụng values()phương pháp:

Ví dụ: Status.values()[0]sẽ trả về PAUSE trong trường hợp của bạn, nếu bạn in nó, nó toString()sẽ được gọi và "PAUSE" sẽ được in.


Đúng, chỉ cần thêm vào Status.values()[0]sẽ là loại Statuskhông String.
khắc nghiệt,

13

Sử dụng tên phương thức mặc định () làm ống thổi đã cho

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
tại sao không ghi đè toString để trả về tên ??
Mohammed Housseyn Taleb

4
Trả lại cái gì? MỘT hoặc một, có sự khác biệt (tên enum hoặc giá trị của nó)
Mercury

9

Bạn có thể thêm phương thức này vào enum Trạng thái của mình:

 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

Tôi tin rằng enum có .name () trong API của nó, khá đơn giản để sử dụng như ví dụ sau:

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

    private enum Security {
            low,
            high
    }

Với điều này, bạn có thể chỉ cần gọi

yourObject.security() 

và nó trả về cao / thấp dưới dạng Chuỗi, trong ví dụ này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.