Tôi có trường hợp tôi muốn sử dụng enums làm khóa trong một số lớp cài đặt. Cơ sở dữ liệu sẽ lưu trữ một giá trị chuỗi, cho phép chúng ta thay đổi hằng số enum mà không cần phải udpate cơ sở dữ liệu (một chút xấu xí, tôi biết). Tôi muốn ném một ngoại lệ thời gian chạy trong constructor của enum như một cách để cảnh sát độ dài của đối số chuỗi để tránh nhấn cơ sở dữ liệu và sau đó nhận được một sự vi phạm ràng buộc khi tôi có thể dễ dàng phát hiện ra nó.
public enum GlobalSettingKey {
EXAMPLE("example");
private String value;
private GlobalSettingKey(String value) {
if (value.length() > 200) {
throw new IllegalArgumentException("you can't do that");
}
this.value = value;
}
@Override
public String toString() {
return value;
}
}
Khi tôi tạo thử nghiệm nhanh cho điều này, tôi thấy rằng ngoại lệ được ném không phải của tôi, mà thay vào đó là ExceptionInInitializerError.
Có thể điều này thật ngu ngốc, nhưng tôi nghĩ đó là một kịch bản khá hợp lệ khi muốn ném một ngoại lệ vào bộ khởi tạo tĩnh.
Nguồn
2011-09-27 20:42:50
Tại sao bạn muốn làm điều đó? Với tôi điều này nghe có vẻ giống như một sự lạm dụng của khái niệm enum. Các giá trị enum được coi là hằng số, mà việc tạo ra không phụ thuộc vào bất cứ thứ gì. Ngay cả khi kỹ thuật bạn _could_ làm điều đó (bằng cách ném một ngoại lệ không được kiểm soát thay vì một ngoại lệ), tôi sẽ đề nghị bạn sửa lại thiết kế của bạn. Nếu bạn đang cố gắng để thực hiện một Singleton thông qua enum này, nó là tốt hơn để thực hiện nó bằng tay như một lớp bình thường. –
Tôi đang triển khai Singleton, nhưng làm thế nào để thực hiện nó bằng tay như một lớp bình thường sẽ tốt hơn? Tôi vẫn sẽ phải ném một ngoại lệ từ mã được gọi bởi một bộ khởi tạo tĩnh. Bạn có thể ném các ngoại lệ không được kiểm soát từ một hàm tạo enum. – tukushan
có điều gì đó * icky * về việc loại trừ một ngoại lệ chỉ bằng cách truy cập một giá trị enum. Không quá tệ khi đó là phương thức getInstance() đơn lẻ. –