2012-08-10 25 views
11

मुझे यह कोड कुछ कोड में मिला।जावा प्रोग्रामिंग मुहावरे: निजी कार्यान्वयन वर्ग

क्या कोई निजी स्थाई वर्ग लागू करने के लिए कोई लाभ है? इसने मुझे सी ++ में पिंपल मुहावरे की याद दिला दी। जावा में पिंपल मुहावरे का उपयोग करने के लिए कोई फायदा है?

public abstract class A { 
    public void doStuff(); 

    public static A getNewInstance() { 
     return new AImpl(); 
    } 

    private static class AImpl extends A { 
     public void doStuff() { 
      .... 
     }  
    } 

} 

उत्तर

17

वहाँ एक निजी स्थिर कक्षा एक को लागू करने के लिए कोई लाभ है?

ठीक है, यह कार्यान्वयन को पूरी तरह से छुपाता है, इसलिए एक encapsulation बिंदु से यह काफी अच्छा है। एक स्थिति मैंने इसे कुछ बार देखा है कस्टम तुलनात्मक है। उदाहरण के लिए:

public class Person 
{ 
    public static final Comparator<Person> NAME_COMPARATOR = new NameComparator(); 
    public static final Comparator<Person> AGE_COMPARATOR = new AgeComparator(); 

    // Name, age etc properties 

    private static class NameComparator implements Comparator<Person> 
    { 
     ... 
    } 

    private static class AgeComparator implements Comparator<Person> 
    { 
     ... 
    } 
} 

वहाँ तुलनित्र कार्यान्वयन कक्षाओं के लिए कोई वास्तविक आवश्यकता Person बाहर दिखाई दे सकता है, और यह सार्वजनिक स्थिर क्षेत्र के माध्यम से आसानी से एक उदाहरण प्राप्त करने के लिए सक्षम होने के लिए अच्छा है।

कोई कॉल करने वालों को कार्यान्वयन को जानने की आवश्यकता नहीं है - केवल एक तुलनित्र वर्ग जो पैरामीटर लेता है, उदाहरण के लिए - वे केवल स्थिरांक को व्यक्त करते हैं जो वे स्थिरांक के माध्यम से चाहते हैं। (आप निश्चित रूप से इसके लिए एक enum का उपयोग कर सकते हैं।)

+1

उत्तर के लिए धन्यवाद। लेकिन क्या 'नामकंपेटर' और 'आयुकंपेटर' गैर-सार्वजनिक वर्गों के रूप में बेहतर नहीं है? मुझे यकीन नहीं है, लेकिन एक स्थिर आंतरिक कक्षा को जोड़ना बाइनरी असंगत बनाता है? – Chip

+0

@Chip: यदि वे 'व्यक्ति' के बाहर गैर-सार्वजनिक कक्षाएं हैं, तो वे अभी भी उसी पैकेज में उपलब्ध हैं जब उन्हें वास्तव में होने की आवश्यकता नहीं है। एक स्थैतिक आंतरिक वर्ग * जोड़ना * धारावाहिक यूआईडी को तब तक बदल सकता है जब तक कि आप इसे स्पष्ट रूप से निर्दिष्ट न करें, लेकिन जावा में बाइनरी क्रमबद्धता इतनी भयानक है कि मैं इसे किसी भी तरह से उपयोग नहीं करता हूं। मुझे विश्वास नहीं है कि यह कोड को चलाने की बाइनरी संगतता को प्रभावित करेगा। –

+0

धन्यवाद जॉन। यह समझ में आता है अगर यह बाइनरी संगतता को तोड़ता नहीं है। डिजाइन को लचीला होने के लिए, मैं एक और वर्ग जोड़ने में सक्षम होना चाहता हूं, 'एआईएमपीएल 2' वैसे ही कहूं, और पुराने ग्राहकों को तोड़ना नहीं चाहता। जावा सीरियलाइजेशन – Chip