Java cho phép enum
làm giá trị cho giá trị chú thích. Làm cách nào tôi có thể xác định loại giá trị mặc định chung enum
cho giá trị chú thích enum
?Giá trị mặc định enum cho giá trị chú thích enum Java
Tôi đã xem xét những điều sau đây, nhưng nó sẽ không biên dịch:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
Có một giải pháp cho vấn đề này hay không?
BOUNTY
Là không có vẻ như có một giải pháp trực tiếp cho trường hợp góc Java này. Vì vậy, tôi bắt đầu một tiền thưởng để tìm ra giải pháp thanh lịch nhất cho vấn đề này.
Giải pháp lý tưởng nên lý tưởng đáp ứng các tiêu chí sau:
- Một chú thích tái sử dụng trên tất cả các enums
- nỗ lực tối thiểu/phức tạp để lấy giá trị enum mặc định như một enum từ trường hợp chú thích
GIẢI PHÁP TỐT NHẤT SO FAR
By Dunes:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
// By not specifying default,
// we force the user to specify values
Class<? extends Enum<?>> enumClazz();
String defaultValue();
}
...
public enum MyEnumType {
A, B, D, Q;
}
...
// Usage
@MyAnnotation(enumClazz=MyEnumType.class, defaultValue="A");
private MyEnumType myEnumField;
Tất nhiên, chúng ta không thể buộc người dùng phải chỉ định một giá trị mặc định có giá trị tại thời gian biên dịch. Tuy nhiên, mọi quá trình xử lý trước chú thích có thể xác minh điều này bằng valueOf()
.
CẢI THIỆN
Arian cung cấp giải pháp thanh lịch để thoát khỏi clazz
trong các lĩnh vực chú thích:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@MyAnnotation()
public @interface MyEnumAnnotation {
MyEnumType value(); // no default has user define default value
}
...
@MyEnumAnnotation(MyEnum.FOO)
private MyEnumType myValue;
Bộ xử lý chú thích nên tìm kiếm cả MyEnumAnnotation
trên lĩnh vực đối với giá trị mặc định được cung cấp.
Điều này yêu cầu tạo một loại chú thích cho mỗi loại enum, nhưng đảm bảo thời gian biên dịch được kiểm tra an toàn.
Điều đó không phải là vô nghĩa? Bất cứ khi nào bạn sẽ xử lý chú thích khi chạy, thông tin chung sẽ bị mất. – Dunes
Nó sẽ tránh tôi phải xác định một chú thích cho mỗi loại enum để sử dụng trong mã của tôi (nó là một vấn đề thời gian biên dịch). – JVerstry
Tôi không có nghĩa ý tưởng này không hữu ích. Nhưng generics chỉ được biết đến lúc biên dịch. Bạn đã đánh dấu chú thích của mình để được giữ lại trong thời gian chạy. Nhưng để truy cập chú thích bạn phải đi qua phản xạ - bạn sẽ không có bất kỳ ý tưởng nào về kiểu gốc chung. – Dunes