2015-05-20 8 views
6

पर विचार करें कि मैं Algorithm enum के रूप मेंEnum से एक उदाहरण कैसे वापस करें?

public enum Algorithm { 
    SHA1("sha1"), 
    HMAC("hmac"),; 

    Algorithm(final String algorithm) { 
    this.algorithm = algorithm; 
    } 
    private final String algorithm; 

    public String getAlgorithm() { 
    return algorithm; 
    } 
} 

है और मैं के रूप में

public class Sha1 { 
    public static String hash(final String text, final byte[] sb) {...} 
} 

और

public class Hmac { 
    public static String hash(final String text, final byte[] sb) {...} 
} 

मैं जब कोई उदाहरण

के लिए कहता है उनके उदाहरणों लौटना चाहते अलग एल्गोरिदम है
Algorithm.SHA1.getInstance() 

प्रश्न

  • मैं कैसे उदाहरण लौट सकते हैं के बाद से मेरी विधि स्थिर है? (यह इतना है कि एक से अधिक थ्रेड एक दूसरे के डेटा के साथ चारों ओर नहीं खेल सकते स्थिर है)
+0

इसे थ्रेड सुरक्षित बनाने के लिए - सिंक्रनाइज़ेशन का उपयोग करने के बारे में क्या? – Razib

+0

वैसे ही आप एक getAlgorithm() विधि जोड़ते हैं, तो आप getInstance() विधि भी जोड़ सकते हैं। आप इसे एनम या विभिन्न सिफर पर लागू कर सकते हैं। 'SHA1 (" sha1 ") {एक्स getInstance() {वापसी नया Sha1(); }, एचएमएसी ("एचएमएसी") {एक्स getInstance() {वापसी नया एचएमएसी(); } '(लेकिन यह आपको एक स्थिर विधि के साथ बहुत मदद नहीं करता है - जो कि किसी भी मामले में एक अच्छा विचार नहीं है)। – eckes

उत्तर

6

आप एक उदाहरण लौट सकते हैं नहीं है जब आपके विधि स्थिर है, लेकिन you can make your enum implement an interface, और एक उदाहरण विधि है कि स्थिर विधि को कॉल करने के आप के लिए आभासी प्रेषण:

public interface EncryptionAlgo { 
    String hash(final String text, final byte[] sb); 
} 

public enum Algorithm implements EncryptionAlgo { 
    SHA1("sha1") { 
     public String hash(final String text, final byte[] sb) { 
      return Sha1.hash(text, sb); 
     } 
    }, 
    HMAC("hmac") { 
     public String hash(final String text, final byte[] sb) { 
      return Hmac.hash(text, sb); 
     } 
    }; 

    Algorithm(final String algorithm) { 
     this.algorithm = algorithm; 
    } 
    private final String algorithm; 

    public String getAlgorithm() { 
     return algorithm; 
    } 
} 

अब आप SHA1 या HMAC उदाहरण पर hash कॉल कर सकते हैं इस तरह,:

Algorithm.HMAC.hash(someText, sb); 

ओ आर EncryptionAlgo उदाहरणों के आसपास पास करें, इस तरह:

EncryptionAlgo algo = Algorithm.SHA1; 
+0

ठीक है, 'एल्गोरिदम' * * में 'शा 1' और 'एचएमएसी' दोनों के स्थिर उदाहरण हो सकते हैं और एक या दूसरे को वापस कर सकते हैं, यह मानते हुए कि दोनों वर्ग 'एन्क्रिप्शनएल्गो' इंटरफ़ेस को लागू करते हैं। लेकिन 'एल्गोरिदम' * स्वयं * इंटरफ़ेस को कार्यान्वित करना बेहतर लगता है, क्योंकि यह 'getInstance() 'को कॉल करने की आवश्यकता से बचाता है। एक enum उदाहरण पहले से ही एक स्थिर सिंगलटन है, इसलिए यह एक और * स्थिर सिंगलटन देखने के लिए सिर्फ एक का उपयोग करने के लिए स्टाइल है। – Wyzard

+1

इसके अलावा, SHA1 और HMAC हैश फ़ंक्शन हैं, एन्क्रिप्शन एल्गोरिदम नहीं। 'एन्क्रिप्शनअल्गो' इंटरफ़ेस को बेहतर तरीके से 'हैशफंक्शन' नाम दिया जाएगा। – Wyzard

+0

आपको वास्तव में इंटरफ़ेस की आवश्यकता नहीं है। आप सीधे enum प्रकार पर विधि कर सकते हैं। –

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