Khi làm việc với các biến / tham số chỉ có thể nhận một số giá trị hữu hạn, tôi cố gắng luôn sử dụng Java enum
, như trong
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Miễn là tôi ở trong mã của mình, điều đó sẽ hoạt động tốt. Tuy nhiên, tôi thường cần giao tiếp với mã khác sử dụng các giá trị thuần túy int
(hoặc String
) cho cùng một mục đích hoặc tôi cần đọc / ghi từ / tới cơ sở dữ liệu nơi dữ liệu được lưu trữ dưới dạng số hoặc chuỗi.
Trong trường hợp đó, tôi muốn có một cách thuận tiện để liên kết mỗi giá trị enum với một số nguyên, để tôi có thể chuyển đổi cả hai cách (nói cách khác, tôi cần một "enum có thể đảo ngược").
Chuyển từ enum sang int rất dễ dàng:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Sau đó, tôi có thể truy cập giá trị int dưới dạng BonusType x = MONTHLY; int id = x.id;
.
Tuy nhiên, tôi thấy không có cách nào hay cho việc ngược lại, tức là đi từ int sang enum. Lý tưởng nhất là một cái gì đó như
BonusType bt = BonusType.getById(2);
Các giải pháp duy nhất tôi có thể đưa ra là:
- Đặt một phương thức tra cứu vào enum, sử dụng
BonusType.values()
để điền vào bản đồ "int -> enum", sau đó lưu vào bộ nhớ cache và sử dụng nó để tra cứu. Sẽ hoạt động, nhưng tôi phải sao chép phương thức này giống hệt nhau vào mỗi enum tôi sử dụng :-(. - Đặt phương thức tra cứu vào một lớp tiện ích tĩnh. Sau đó, tôi chỉ cần một phương thức "tra cứu", nhưng tôi sẽ phải tìm hiểu phản chiếu để làm cho nó hoạt động cho một enum tùy ý.
Cả hai phương pháp đều có vẻ rất khó xử cho một vấn đề (?) Đơn giản như vậy.
Bất kỳ ý tưởng / hiểu biết nào khác?
ordinal()
.ordinal()
) hay do các thế lực bên ngoài quyết định?