2010-02-12 14 views
9

मैं एक पुस्तकालय लिखता हूं जो enums पर भरोसा करना चाहिए लेकिन वास्तविक enum मेरी पुस्तकालय के उपयोगकर्ता द्वारा परिभाषित किया जाना चाहिए।अमूर्त जावा enum

निम्नलिखित उदाहरण में authorize विधि को enum प्रकार Permission के पैरामीटर की आवश्यकता है।

acl.authorize(userX, Permission.READ, Permission.WRITE) 

मेरी लाइब्रेरी लाइब्रेरी उपयोगकर्ता द्वारा परिभाषित मनमाने ढंग से अनुमतियों को संभालने में सक्षम होना चाहिए। लेकिन मैं Permission enum के बिना अपनी लाइब्रेरी संकलित नहीं कर सकता। तो मुझे

abstract enum Permission 

मेरी लाइब्रेरी में कुछ चाहिए। क्या ऐसा करने के लिए कोई कामकाज है?

उत्तर

21

मैं एक अंतरफलक जो enum तो लागू करेगा का प्रयोग करेंगे।

public interface PermissionType{} 

के साथ कुछ जो कि उदाहरण के लिए उपयोग किया जाएगा ग्राहक इस तरह के रूप

public enum Permission implements PermissionType 
[...] 

फिर अपने एपीआई PermissionType प्रकार

+0

की जांच करें जैसा कि जेडीके 7 की "अधिक एनआईओ फीचर्स" में उपयोग किया जाता है। उदाहरण के लिए: http://download.java.net/jdk7/docs/api/java/nio/file/StandardCopyOption.html –

+3

@ टॉमहॉविन-tackline: वह लिंक अब मर चुका है। नया लिंक लंबे समय तक लाइव रहें: http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html –

1

यहां दिए गए चरणों का सुझाव दिया गया है।

  1. एक एनोटेशन बारे में - public @interface Permission
  2. उपयोगकर्ता कि टिप्पणी के साथ उनकी अनुमति enums में से प्रत्येक पर टिप्पणी करते हैं:

    @Permission 
    public enum ConcretePermissionEnum {..} 
    
  3. अपने authorize विधि बना दें की तरह:

    public boolean authorize(User user, Enum... permissions) { 
        for (Enum permission : permissions) { 
         if (permission.getClass().isAnnotationPresent(Permission.class)){ 
          // handle the permission 
         } 
        } 
    } 
    

आप तो आप उपयोगकर्ता enums तुम्हारा का एक इंटरफ़ेस को लागू (बजाय एनोटेट जा रहा है) कर सकते हैं आपकी अनुमति enums कुछ विशिष्ट तरीकों चाहते हैं, या सिर्फ एक 'मार्कर' चाहते हैं,:

interface PermissionInterface {..} 
enum ConcretePermission implements PermissionInterface 

यह एक संकलन समय, बल्कि एक रन-टाइम की जांच की तुलना में,, authorize विधि हस्ताक्षर की तरह लग रही के साथ सक्षम हो जाएगा एनोटेशन दृष्टिकोण के साथ के रूप में:

public boolean authorize(User user, PermissionInterface... permissions) 
+0

मेरे पुस्तकालय पढ़ने की अनुमति नहीं जानता चाहिए का उपयोग कर मानकों को स्वीकार करेंगे एक enum परिभाषित करने के लिए। उदाहरण उस उपयोग को दिखाता है जहां मेरी लाइब्रेरी का उपयोगकर्ता enum को परिभाषित करता है। मेरी लाइब्रेरी केवल "अनुमति enum के कुछ तत्व" पता होना चाहिए। – deamon

+0

@daemon मेरे अपडेट – Bozho

संबंधित मुद्दे