2011-02-06 8 views
12

क्या कोई मौजूदा लाइब्रेरी है जो मुझे जावा विधि को @Const के रूप में एनोटेट करने की अनुमति देती है, ताकि संकलक (एपीटी I presume का उपयोग करके) एक फ़ील्ड को अपडेट करता है या किसी फ़ील्ड पर गैर-कॉन्स विधि को आमंत्रित करता है ; और @Const के रूप में पैरामीटर को एनोटेट करें, ताकि स्वीकार करने की विधि किसी भी गैर[email protected] कॉन्स्ट विधियों का आह्वान नहीं कर सकती है, या अपने किसी भी फ़ील्ड को अपडेट नहीं कर सकती है?एनोटेशन का उपयोग कर जावा में कॉन्स्ट सहीता?

(मूल रूप से, एनोटेशन का उपयोग करने के लिए जावा स्थिरांक-शुद्धता जोड़ने की कोशिश कर, कुछ स्पष्ट इस तरह के आदि एक @ कॉन्स्ट टाइप पैरामीटर से/बताए, जैसा कि ऊपर सवाल में नहीं शामिल किया गया विवरण, देखते हैं)

मुझे यह मिला है: http://confluence.atlassian.com/pages/viewpage.action?pageId=182158080 लेकिन ऐसा लगता है कि यह केवल आईडीईए के हिस्से के रूप में उपलब्ध है।

class Person { 
    private String name; 
    private String address; 

    @Const public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    ... etc. for address 
} 

अब, अगर मैं इस तरह के रूप में एक विधि को परिभाषित:

void processPerson(@Const Person p) 

एक लाइन जैसे:

नीचे स्पष्टीकरण के लिए एक अनुरोध के बाद, यहां दिखाने के लिए मैं क्या मतलब नमूना कोड p.getName()processPerson में ठीक होगा, क्योंकि getName को @Const विधि के रूप में चिह्नित किया गया था। लेकिन processPerson के भीतर p.setName() पर कॉल करना एक त्रुटि के रूप में फ़्लैग किया जाएगा।

ध्यान दें कि यह final से बहुत अलग है: यदि पैरामीटर final Person p के रूप में परिभाषित किया गया था, p के लिए किसी भी काम के अवैध होता है, लेकिन यह अभी भी पूरी तरह से संशोधित करने के लिए क्या p को संदर्भित करता है मान्य है (या तो p.setName(...) या इससे भी अधिक सीधे का उपयोग कर, p.name = ... साथ।

+2

क्या आपने इस उद्देश्य के लिए 'अंतिम' कीवर्ड का उपयोग करने का प्रयास किया था? इसके साथ गलत क्या है? – AlexR

+4

एक अंतिम विधि एक विधि है जिसे ओवरराइड नहीं किया जा सकता है। यह अलग है। – aioobe

+0

मेरा मतलब अंतिम विधि नहीं है। मेरा मतलब अंतिम तर्क है। मुझे पता है कि अंतिम विधि क्या है :) – AlexR

उत्तर

8
  • JSR-305 माना जाता है कि बस के बारे में आप

  • निजी तौर पर जो खोज रहे हैं करता है, मैं अगर मैंउपयोग कर सकते हैं देखना चाहते हैं उसके लिए 0। यह एक अद्भुत छोटी मुक्ति है (हाइबरनेट पर निर्भर नहीं है, यह छोटा है) और यह आपके डेटा को साफ रखने के लिए चमत्कार करता है। documentation देखें।

  • एक Google लड़के ने हाल ही में Contracts for Java भी शुरू किया, लेकिन यह अभी तक उत्पादन की गुणवत्ता नहीं हो सकती है।

6

Checker Framework पर एक नजर डालें, मूल रूप से चेकर्स कि एक विस्तृत प्रकार एनोटेशन प्रणाली [JSR-308] के माध्यम से सॉफ्टवेयर दोष [JSR-305] पता लगाने का प्रयास है जो।

इसमें एक अपरिवर्तनीय चेकर (2 वास्तव में) है जो आपको @Mutable, @Immutable, और @Readonly जैसे अपरिवर्तनीय एनोटेशन के साथ कोड को एनोटेट करने की अनुमति देता है। यह उपकरण एक अपरिवर्तनीय उदाहरण और केवल पढ़ने के संदर्भ के बीच अंतर करता है।

I प्यार इस ढांचे और मुख्य रूप से इसे शून्य जांच के लिए उपयोग करते हैं, लेकिन मैं अपरिवर्तनीय चेकर और इंटर्निंग चेकर का उपयोग शुरू करने की कोशिश कर रहा हूं।

@Const के रूप में पैरामीटर को एनोटेट करें, ताकि स्वीकार करने की विधि किसी भी गैर[email protected] कॉन्स्ट विधियों का आह्वान न कर सके या अपने किसी भी फ़ील्ड को अपडेट न कर सके?

दिखाई देगा: इतना है कि संकलक (का उपयोग करते हुए मुझे लगता है उपयुक्त),

void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); } 

मुझे @Const के रूप में एक जावा विधि टिप्पणी करने की अनुमति देता है झंडा अगर यह एक क्षेत्र अद्यतन करता है एक त्रुटि होगा, या किसी फ़ील्ड पर गैर[email protected] कॉन्स्ट विधि का आह्वान करता है; और

यह प्रश्न में उदाहरण के लिए इस तरह दिखेगा:

public String getName(@ReadOnly Person this) { 
    return name; 
} 

@ReadOnly यहाँ रिसीवर (this उदाहरण जिसका विधि बुलाया जा रहा है) नहीं संशोधित किया जाना चाहिए इंगित करता है। स्पष्ट अतिरिक्त पैरामीटर के बावजूद, पद्धति अभी भी सामान्य रूप से कहा जाता है:

public aspect ConstAspect{ 
declare warning : withincode(* *(..,@Const (*),..)) : "Calling Const Method.."; 
} 

:

@ReadOnly Person person = new Person(); 
person.getName(); 

+1

यह सही है, धन्यवाद! उम्र के लिए इस तरह की कुछ खोज रहे थे, आखिरकार इसे जावा 8 के साथ खुश करने के लिए बहुत खुशी हुई। ग्रहण प्लगइन के साथ बहुत शक्तिशाली चीजें, मेवेन, चींटी, ग्रैडल इत्यादि प्लगइन के साथ भी, किसी और के लिए दिलचस्पी है। सिर्फ एक सिफारिश यह है कि आईजीजे एनोटेशन सुविधा ओवरलैप द्वारा उलझन में किसी के लिए जावरी चेकर की तुलना में अधिक अभिव्यक्तिपूर्ण दिखता है। जावरी को शायद इमो को अनदेखा किया जाना चाहिए। (विधियों पर रिसीवर एनोटेशन को सही करने के लिए भी संपादित उत्तर।) –

0

मैं @AlexR टिप्पणी seconding कर रहा हूँ, इस AspectJ, इन पंक्तियों के साथ कुछ प्रयोग किया जा सकता यह आपकी आवश्यकताओं के लिए सही नहीं है, लेकिन मैं मूल रूप से एक दृष्टिकोण दिखाना चाहता हूं, उपरोक्त मामले में किसी भी विधि जिसमें पैरामीटर पर @Const है, को चेतावनी के साथ टैग किया गया है। एक बेहतर जॉइनपॉइंट के साथ, चिंता के सभी बिंदुओं को एक त्रुटि के साथ टैग किया जा सकता है।

-4

const सी ++ में था। जावा ने स्पष्ट रूप से इसे उद्देश्य पर हटा दिया। और अब वास्तव में अनुभव किए बिना लोग const सोचते हैं कि यह एक अच्छा विचार है।

एक बार जब आप const के रूप में एक विधि चिह्नित करते हैं, तो यह कैंसर की तरह फैल जाएगा, बहुत जल्द आप लगभग const लगभग सबकुछ पाएंगे। not-const होना बेहतर होगा।

स्पष्ट रूप से यह बेकार है। यह केवल अकादमिक रूप से आकर्षक है, वास्तविक प्रोग्राम में किसी की भी मदद नहीं करता है।

+3

यह बहुत ही बहस योग्य है। मैंने अपने सी ++ कार्यक्रमों में 'कॉन्स' का उपयोग किया, और मुझे यह फैलाना याद नहीं है। गेटर्स को कॉन्स्ट के रूप में चिह्नित करना और एक्सेस ऑपरेटरों (जैसे 'ऑपरेटर [] ') के कॉन्स ओवरलोड करना वास्तव में वस्तुओं को आकस्मिक संशोधनों को रोकने में मदद करता है। –

+4

मुझे लगता है कि कॉन्स भी अच्छा है (सी ++ अनुभव के 8 साल)। और फैलाने के बारे में - एक विधि पर अपवाद विनिर्देश के बारे में कैसे? यह कैंसर की तरह फैलता है, लेकिन जावा देव इसके साथ रहने का प्रबंधन करते हैं। – mark

+8

यह एक * अच्छी * चीज है जो कॉन्स 'कैंसर की तरह फैलती है'। जितनी अधिक चीजें हैं जो आपके कोड को दुरुपयोग से सुरक्षित रखती हैं। –

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