2012-08-10 16 views
6

में निरंतर शामिल करने के लिए मेरे पास एक सार वर्ग है, जिसके लिए मैं सभी सबक्लास को कार्यान्वयन के आधार पर निरंतर परिभाषित करना चाहता हूं- यह मुख्य रूप से कक्षा कार्यान्वयन के बारे में मेटाडेटा है।बल उप-वर्गों में अमूर्त जावा वर्ग

सुपर क्लास में:

protected static final String OBJECT_NAME; 
protected static final String OBJECT_DEF; 

और फिर उपवर्ग में:

protected static final String OBJECT_NAME = "awesome class"; 
protected static final String OBJECT_DEF = "an awesome class that is also great"; 

वहाँ एक निरंतर घोषित करने के लिए एक वर्ग के कार्यान्वयन के लिए मजबूर करने के लिए एक रास्ता है?

+1

शायद यह ध्यान देने योग्य है कि संभावित रूप से अलग-अलग मूल्यों के साथ निरंतर स्थिर नहीं है! तो पीटर्स के जवाब के साथ जाओ। – TedTrippin

उत्तर

7

आप उप-वर्ग को उस विधि को परिभाषित करने के लिए मजबूर कर सकते हैं जो उस वर्ग के लिए निरंतर हो सकता है।

protected abstract String objectName(); 
protected abstract String objectDef(); 

नोट: यदि आपके उप-वर्गों की उप-श्रेणी है, तो ये इन विधियों को ओवरराइड करने के लिए "भूल" सकते हैं।

+0

इस बारे में सुझाव देने वाला था;) –

+2

सबसे अच्छा आप प्राप्त कर सकते हैं। चूंकि ओ.पी. वह वही नहीं कर सकता जो वह करना चाहता है, यह निश्चित रूप से सबसे अच्छा तरीका है। –

+0

धन्यवाद! इस बारे में नहीं सोचा (जाहिर है)। स्थिर वर्ग लागू करने के उप-उप कार्यान्वयन को आश्वस्त करने का कोई तरीका नहीं है, ये विधियां वहां हैं? –

0

नहीं। आप नहीं कर सकते।

आप अपने अमूर्त सुपरक्लास में निरंतर ठोस मूल्य निर्दिष्ट किए बिना निरंतर घोषित नहीं कर सकते हैं। दूसरे मामले में आपको एक त्रुटि मिलेगी। आपको अपनी घोषणा के दौरान या कक्षा कन्स्ट्रक्टर में अंतिम फ़ील्ड प्रारंभ करना चाहिए।

आप सार तत्वों को घोषित कर सकते हैं जो आपके चर को आरंभ करेंगे (लेकिन यह अधिक खराब हो जाएगा)। इस तरह:

protected String OBJECT_NAME = getObjectNameValue(); 

public abstract String getObjectNameValue(); 

लेकिन इस तरह के मामले में अपने चर और तरीकों स्थिर नहीं होना चाहिए। क्योंकि आप स्थैतिक तरीकों को अमूर्त (look here for explanation) परिभाषित नहीं कर सकते हैं।

या आप पीटर लॉरी के प्रस्ताव के रूप में सीधे चर के तरीकों का उपयोग कर सकते हैं, यह अधिक पठनीय होगा।

0

यह इस तरह से काम नहीं करेगा। मैं सार कार्यों के रूप में इन निर्धारित करना होगा:

protected abstract String objectName(); 
protected abstract String objectDef(); 

और उपवर्ग में:

private static final String OBJECT_NAME = "awesome class"; 
private static final String OBJECT_DEF = "bla"; 

protected String objectName(){ 
    return OBJECT_NAME; 
} 

protected String objectDef(){ 
    return OBJECT_DEF; 
} 

तरीकों नहीं static रहे हैं, लेकिन मुझे लगता है कि यह सबसे करीब आप आप क्या चाहते करने के लिए मिल सकता है।

Inreface HasObjectNameAndDef { 
    public String getObjectName(); 
    public String getObjectDef(); 
} 

और अपने वास्तविक कक्षाएं इंटरफ़ेस को लागू है: आप सुपर क्लास के लिए समझदार चूक की जरूरत नहीं है के रूप में

1

साथ ही एक इंटरफ़ेस के लिए जा सकते हैं। आपको आसान परीक्षण मिलता है बोनस।

-1

मुझे पता है कि आप क्या कह रहे हैं।

उदाहरण के लिए

मैं, एक इंटरफेस (जो मैं ExecutableList बोल रहा हूँ) USER_FRIENDLY_NAME

public interface ExecutableList<T extends ExecutableList<T,E>,E> //This is type parameter 
    extends List<E>,            //self referencing. Trust 
      Comparable<E>,          //me, it has its uses. 
{ 
    /** This would declare a constant but leave it to sub-interfaces/classes to define it. */ 
    abstract String USER_FRIENDLY_NAME; 

    //Define the rest of your interface 

} 

दुर्भाग्य नामक एक contant स्ट्रिंग फ़ील्ड है करना चाहते हैं, यह जावा में संभव नहीं है। जब आप जावा इंटरफ़ेस में कोई फ़ील्ड घोषित करते हैं, तो यह संशोधक संशोधक public, static, और final का तात्पर्य है।जावा प्रोग्रामिंग भाषा में भविष्य में बदलाव abstract को जोड़ने के लिए अनुमति देता है, इस प्रकार निहित संशोधक public abstract static final String USER_FRIENDLY_NAME; बनाते हैं, लेकिन जब आप इसके लिए नियमों को स्पष्ट रूप से परिभाषित कर सकते हैं, तो abstract शब्द का उपयोग भ्रमित हो जाएगा, क्योंकि abstract और final को आम तौर पर समझा जाता है विपरीत अर्थ परिभाषित करें।

मैं अपनी उंगलियों को पार कर रहा हूं कि जावा का भविष्य संस्करण इसे कार्यान्वित करेगा। मैंने सुना है कि जावा 9 में निजी इंटरफ़ेस विधियों को जोड़ा जाएगा (डिफ़ॉल्ट विधियों के बीच उपयोग के लिए) लेकिन भाषा के अलावा इस शब्द पर अभी तक कोई शब्द नहीं है। पहले विचार करने के लिए कई पिछड़ा संगतता मुद्दों होंगे, मुझे यकीन है। यदि ओरेकल के किसी भी व्यक्ति ने इसे पढ़ा है, तो कृपया हमें इंटरफेस में डिस्काउंट कॉन्स्टेंट्स दें और इन्हें क्लैस/इंटरफेस को परिभाषित करें !!!

इस बीच, आपका एकमात्र विकल्प आपके इंटरफेस या अमूर्त वर्ग में String getUserFriendlyName(); विधि को परिभाषित करना है। सुरुचिपूर्ण और शायद उतना ही प्रभावशाली नहीं है, लेकिन आपके पास वर्तमान में कोई अन्य विकल्प नहीं है।

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