2012-11-26 16 views
8

मैं एक एनोटेशनआईडीई प्रासंगिक व्यवहार

/** 
* Highlights this method is declared in XML 
*/ 
public @interface FromXML { 
} 
मैं तरीकों पर इस का उपयोग कर रहा

कि इस तरह दिखना बना लिया है के साथ एक जावा एनोटेशन बनाएं इस विधि को कॉल करने के लिए एंड्रॉइड प्रतिबिंब प्रणाली। हालांकि इनपुट var v अप्रयुक्त है, इसलिए मेरा आईडीई मुझे इस बारे में चेतावनी देता है। मुझे यह चेतावनी पसंद है और मैं इसे अपने शेष कोड पर चाहता हूं।

enter image description here

चेतावनी मैं कर सकता छिपाने के लिए

@SuppressWarnings("unused") 
@FromXML 
public void onSomethingClick(View v){ 

} 

या मैं एक परम टैग

जोड़ सकता है लेकिन मैं होता बल्कि कि आईडीई (ग्रहण) मेरी @FromXML एनोटेशन पढ़ता है और नहीं करता है मुझे चेतावनी नहीं दीजिए।

मुझे पता है you can't extend an Annotation, लेकिन मूल रूप से मैं क्या करना चाहता हूं।

क्या कोई तरीका है कि मैं अपनी एनोटेशन को 'suppress warnings' एनोटेशन के रूप में पहचाने जाने के लिए जोड़ सकता हूं।

या

वहाँ चेतावनी को दबाने 'की तरह कार्य' के लिए मेरी एनोटेशन कोड करने के लिए कोई तरीका है?

+0

मुझे यकीन नहीं है लेकिन मुझे लगता है कि यह लेख: http://technicalmumbojumbo.wordpress.com/2008/01/13/java-custom-annotations/ का समाधान है, @Retention –

+1

आपकी कस्टम एनोटेशन और 'v' पैरामीटर के पास एक दूसरे के साथ कुछ लेना देना नहीं है। "अपनी कस्टम एनोटेशन एक्ट को एक दबाने वाली चेतावनी अधिनियम" की तरह गड़बड़ न करें। भाषा के दायरे से, आईडीई अप्रयुक्त पैरामीटर के बारे में आपको बहुत सही चेतावनी देता है, क्योंकि एक या अधिक आने वाले डेटा को अनदेखा किया जाता है। – gyorgyabraham

+0

@gyabraham I ' एन एनोटेशन को उन जगहों पर इस्तेमाल किया जा सकता है जहां मेरे पास विधि पर केवल एक इनपुट var होगा। इसलिए मैं ** ** चाहता हूं कि उन्हें एक दूसरे के साथ करना पड़े। (यदि इसमें 0 वर्र्स या 1 से अधिक var थे संभावित रूप से एक त्रुटि दे सकता है) – Blundell

उत्तर

3

ठीक है, मैं किसी भी आसान तरीका या रूप में ऐसा नहीं कर सकते।

एनोटेशन पैकेज को देखते हुए http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/package-summary.html

मैं एक एनोटेशन का विस्तार नहीं कर सकते हैं: Why is not possible to extend annotations in Java?

मैं एक एनोटेशन java.lang.Override

मैं नकल नहीं/नकली/का नाटक कर सकते हैं लागू नहीं कर सकते @Override

हो अगर मैं अपने @FromXML करने के लिए @Override जोड़ने यह नहीं ch नीचे विरासत में मिलती है ऐन।

एकमात्र तरीका एक ग्रहण प्लगइन बनाना होगा जो मेरी एनोटेशन को पहचानता है और चेतावनी को रोकता है। शर्मिंदा क्योंकि मुझे ऐसा करने का आसान तरीका नहीं मिल रहा है।

मैं भी, मेरे @FromXML प्रवेश बिंदुओं के लिए एक इंटरफेस बनाने के मार्ग नीचे चला गया यह बहुत अच्छा था और भेजी मेरी Activity एक प्रकार का था और इसलिए मैं एनोटेशन अब जरूरत नहीं थी, शायद इस डिजाइन परिवर्तन जवाब है ।

7

मुझे लगता है कि आप इस विधि को परिभाषित करने वाला इंटरफ़ेस बना सकते हैं। इस तरह, आपकी कक्षा विधि को ओवरराइड कर देगी और कोई चेतावनी नहीं होनी चाहिए।

FromXML.java:

public @interface FromXML { 
} 

MyInterface.java:

public interface MyInterface { 
    @FromXML 
    public void onSomethingClick(View v); 
} 

MyClass.java

public MyClass implements MyInterface { 

    @Override 
    @FromXML 
    public void onSomethingClick(View v){ 
    } 
} 

संपादित करें: एक अन्य समाधान हो सकता है सार के रूप में अपने विधि को परिभाषित करने के। दरअसल, जैसा कि मैं आपका कोड समझता हूं, आपकी विधियां सिर्फ घोषणा है (कार्यान्वयन एक एक्सएमएल फ़ाइल में हैं)। इसलिए, आपकी समस्या एक आईडीई समस्या से अधिक डिज़ाइन समस्या है (आपका आईडीई चेतावनी के बारे में सही है)। हकीकत यह है कि आपकी विधि सार है और कहीं और परिभाषित की गई है।

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

public abstract class MyClassUsingOnSomethingClick { 

/* 
* All the class implementation can be here as the normal class. 
*/ 

    @FromXML 
    public abstract void onSomethingClick(View v); 

} 

मुझे पता है तुम कहूँगा इस समाधान यह असंभव वस्तु आसानी से बनाने के लिए है कि लेकिन आप दो समाधान तो होगा:

1 - अपने वस्तुओं इनलाइन बनाएँ:

MyClassUsingOnSomethingClick a = new MyClassUsingOnSomethingClick() { 
    @Override 
    @FromXML 
    public void onSomethingClick(View v) {} 
}; 

2 - अपने सारमें एक कारखाने पद्धति बनाएं 0:

public static final MyClassUsingOnSomethingClick createEmptyMyClassUsingOnSomethingClick() { 
    return new MyClassUsingOnSomethingClick() { 
     @Override 
     @FromXML 
     public void onSomethingClick(View v) {} 
    }; 
} 

// and then, create with: : 
MyClassUsingOnSomethingClick a = MyClassUsingOnSomethingClick.createEmptyMyClassUsingOnSomethingClick(); 

है, तब भी मैं समझता हूँ कि आप एक तेजी से समाधान पसंद करते हैं, मेरा मानना ​​है कि यह समाधान है कि साफ है क्योंकि:

  1. यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग दर्शन सम्मान करता है।
  2. यह एक आईडीई के लिए विशिष्ट नहीं है।
  3. यह बचा जाता है एनोटेशन प्रसंस्करण उपकरण (जो, मेरी राय में बहुत समझदारी से इस्तेमाल किया जाना चाहिए)
+0

यह विधि नहीं है जो अप्रयुक्त है, यह चर 'v' है। – atamanroman

+0

वैसे, अगर इस विधि को हमेशा इस एनोटेशन को असाइन किया जाना चाहिए, तो मुझे लगता है कि आप सीधे इंटरफ़ेस में एनोटेशन भी लिख सकते हैं। – ncenerar

+0

हां लेकिन चूंकि ओवरराइड विधि के लिए "पैरामीटर अप्रयुक्त चेतावनी" नहीं है, यह चाल करेगा। – ncenerar

11

तुम हमेशा ग्रहण के लिए एक प्लगइन बना सकते हैं, कि स्रोत के माध्यम से स्कैन और अपने मामले में इन टिप्पणियों को मिलेगा @FromXML और अपने मामले @SuppressWarnings में एक अतिरिक्त एनोटेशन जोड़ें।

आप इसके लिए एक कमांड बना सकते हैं और जब उस आदेश को निकाल दिया जाता है तो आप इस प्लगइन को चलाएंगे।

Creating Eclipse Plugin

आशा इस मदद करता है।

या चेतावनी Adding warnings in Eclipse using AspectJ

इस ट्यूटोरियल ग्रहण करने के लिए चेतावनी जोड़ने के लिए AspectJ का उपयोग करता है दूर करने के लिए AspectJ का उपयोग करना: अनायास नहीं इस (इसे करने की कोशिश) उपयोग किया जा सकता था -

अद्यतन यदि डेवलपर कोड में System.out.println() का उपयोग करता है। इसलिए पर रिवर्स किया जा सकता है जब एनोटेशन मौजूद होता है तो चेतावनी हटा दें।

अद्यतन 2: ग्रहण में एक तरह से कस्टम एनोटेशन प्रोसेसर या bundeled एनोटेशन प्रोसेसर (कि अप्रयुक्त चर चेतावनी उत्पन्न करता है) editting बनाने के लिए नहीं है। तो उस प्रोसेसर को एक कस्टम तरीके से ट्विक करना होगा।

कुछ महान लिंक:

Tutorials for Eclipse Annotation processor development

Java Development Tools - Annotation Processing Tools

+0

के साथ क्या कर सकते हैं और नहीं कर सकते हैं, मैं अपने स्रोत कोड को बदलने के लिए प्लगइन नहीं चाहता हूं। मैं चाहता हूं कि प्लगइन मेरी एनोटेशन को नोटिस करे और चेतावनी न दे। इसका एक उदाहरण अच्छा होगा। – Blundell

+0

ये ग्रहण एनोटेशन प्रोसेसर विकास के लिए ट्यूटोरियल के कुछ लिंक हैं जो हमें मदद कर सकते हैं। ग्रहण के साथ बंडल एनोटेशन प्रोसेसर के कोड को ट्विक करने का प्रयास कर रहा है। –

+2

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

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