2011-01-26 14 views
5

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

आप कल्पना कर सकते ऐसा

package foo; 

@RunWith(Suite.class) 
@SuiteClasses({ TestClassOne.class, TestClassTwo.class }) 
public class TestSuite{ 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassOne{ 

    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassTwo{ 

    } 
} 

कुछ ऐसा दिखाई देगा अब यह कहेंगे जब संकलक यह किक TestClassOne एक प्रकार को हल नहीं किया जा सकता है। इसे हल करने का एक आसान तरीका है। उदाहरण के लिए इसे स्थिर वर्ग के एक अन्वेषण आयात की आवश्यकता होगी।

import foo.TestSuite.TestClassOne; 
import foo.TestSuite.TestClassTwo; 

मेरे सवाल है, किसी को भी क्या संकलक नियम या कारणों के लिए एनोटेशन नहीं करने के लिए वर्ग स्थिर भीतरी वर्ग देखने में सक्षम होना भी हो सकते हैं व्याख्या कर सकते हैं। ध्यान रखें कि एक पैकेज निजी वर्ग को ठीक से देखा जाता है और आयात के बिना संकलित किया जाता है।

उत्तर

5

यह एक दिलचस्प है। [1] के अनुसार, "TestClassOne" नाम का दायरा "पूरे शरीर" वर्ग "TestSuite" है।

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

एक और सवाल यह है कि एनोटेशन में "टेस्टसूइट" का सरल नाम कैसे संदर्भित किया जा सकता है? यह पता चलता है कि spec इस को कवर करता है। एनोटेशन एक संशोधक है, जो कि प्रकार की घोषणा का हिस्सा है, और "पैकेज में शीर्ष स्तर के प्रकार का दायरा प्रकार है।"

हालांकि यह संभव है कि spec को दुर्घटना से सही हो गया। एनोटेशन शुरू होने से पहले नियमों को परिभाषित किया गया था, और बाद में ही रहते हैं। इसलिए हालांकि यह तकनीकी स्थिति में मामला शामिल है, यह एक दुर्घटना हो सकती है। यह भाषा डिजाइनरों की मस्तिष्क शक्ति पर संदेह नहीं है - पूरी कल्पना बहुत जटिल है।

[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3

+0

अच्छी तरह से समझाया, धन्यवाद। –

5

आप आंतरिक वर्ग आयात करने के लिए की जरूरत नहीं है, तो आप उन्हें

TestSuite.TestClassOne 

विवरण का उपयोग कर यहां पहुंच सकता है JLS में पाया जा सकता, लेकिन मेरे सरल नियम है: एक आयात a.b.c.d.e आप के बजाय e उपयोग करने के लिए अनुमति देता है पूरी तरह से योग्य नाम का। यह आपको f का उपयोग करने की अनुमति नहीं देता है।

+0

पर्याप्त मेला, मैं कक्षा को उसके बाल वर्ग का संदर्भ दे सकता हूं। मेरी आपत्ति इस तथ्य से अधिक थी कि आप कक्षा के भीतर अपने बच्चे के स्थैतिक वर्ग को अपने वर्ग के नाम से अर्हता प्राप्त किए बिना संदर्भित कर सकते हैं। मैं देख रहा हूं कि आपको क्वालीफायर –

+0

देखने की आवश्यकता है। कक्षा के भीतर यह है कि आप कक्षाओं से भीतरी कक्षाओं सहित सबकुछ आयात करते हैं। – maaartinus

2

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

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