2013-06-06 41 views
8

Trong thư viện của tôi có khái niệm "cấp độ người dùng". Tôi đã cung cấp một số cấp độ mặc định nhưng vì nhiều lý do khác nhau muốn cung cấp cho người dùng tùy chọn sử dụng các cấp của riêng họ.Cách tốt nhất để hỗ trợ "enumable enums" trong chú thích?

Hiện nay điều này được thực hiện như

public interface AdminLevel { 
    public void name(); 
} 

public enum StandardAdminLevels implements AdminLevel { 
    ADMIN, 
    ANONYMOUS 
} 

Vấn đề là người dùng thường sẽ được đi qua cấp độ người dùng được yêu cầu của họ trong một chú thích. Những điều tôi đã cố gắng và thất bại:

  • Sử dụng AdminLevel như các loại - Không có "loại không hợp lệ cho thành viên chú thích"
  • Sử dụng String như loại nhưng thiết lập các giá trị với StandardAdminLevels.ADMIN.name() - Không có "giá trị thuộc tính phải liên tục"
  • Làm StandardAdminLevels một lớp học cuối cùng mà không thực hiện bất cứ điều gì với public static thức lĩnh vực đối với từng mức độ (thực chất là một enum) - không có 'loại không hợp lệ cho thành viên chú thích'

có cách khác tôi có thể ' t nghĩ đến việc có enums mở rộng trong chú thích? Tôi đang cố gắng để gắn bó với enums do sự rõ ràng của họ và bảo vệ cơ bản chống lại các giá trị không hợp lệ, nhưng cách duy nhất khác tôi có thể nghĩ đến là String hằng số. Vấn đề tôi có là yêu cầu xác minh ở mọi cấp độ người dùng điểm duy nhất được sử dụng, có khả năng ngay cả trong mã máy khách

Bất kỳ ý tưởng nào?

+0

Một enum có thể mở rộng là mâu thuẫn về mặt. Toàn bộ mục đích của enums là để xác định toàn bộ thiết lập và chỉ cho phép những người đó. – Aurand

+0

@Aurand Chuỗi ma thuật hay ma thuật ints tốt hơn thế nào? Enums vẫn hữu ích ở đây để xác nhận các giá trị – TheLQ

+0

Có gì sai khi có một enum với tất cả các giá trị có thể? –

Trả lời

7

Một ý tưởng: mỗi AdminLevel có thể là lớp riêng của nó. Chuyển số Class của lớp đó vào chú thích.

public final class Admin implements AdminLevel { ... } 
public final class Anonymous implements AdminLevel { ... } 

@Requires(Admin.class) public void protectedMethod() { ... } 

@interface Requires { 
    Class<? extends AdminLevel> value(); 
} 
+0

Woah, đó thực sự không phải là một ý tưởng tồi. Các lớp thậm chí có thể thực hiện Comparable và do đó người dùng có thể sắp xếp – TheLQ

+0

Suy nghĩ tốt, nhưng tôi không chắc rằng tôi thấy lợi thế trên các chuỗi đơn giản. –

+0

@Paul Xác thực tự động ("sadfakjdsf" không tự động là cấp quản trị) và khả năng sắp xếp của người dùng. Tôi sẽ xem nếu có ý tưởng khác, nhưng đây là một ý tưởng khá tốt – TheLQ

Các vấn đề liên quan