एक घोषणा में नहीं होने पर आरंभीकरण सिंटैक्स


141

मैं लिख सकता हूँ:

AClass[] array = {object1, object2}

मैं भी लिख सकता हूँ:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

लेकिन मैं नहीं लिख सकता:

AClass[] array;
...
array = {object1, object2};

यह जावा द्वारा अवरुद्ध क्यों है?

मुझे पता है कि इसके आसपास कैसे काम करना है, लेकिन समय-समय पर यह सरल होगा।

उदाहरण के लिए:

public void selectedPointsToMove(cpVect coord) {

    if (tab == null) {
        if (arePointsClose(coord, point1, 10)) {
            cpVect[] tempTab = {point1};
            tab = tempTab;
        } else if (arePointsClose(point2, coord, 10)) {
            cpVect[] tempTab = {point2};
            tab = tempTab;
        } else {
            cpVect[] tempTab = {point1,point2};
            tab = tempTab;
        }
    }
}

यह सरल प्रश्न जो मुझे तब से परेशान कर रहा है जब मैंने जावा में सरणियों के साथ खेलना सीखा।


पाठ प्रारूप के बारे में क्षमा करें, लेकिन चीन में किसी कारण से पाठ लेआउट बटन दिखाई नहीं देते हैं: एस
जेसन रोजर्स

कोड के लिए, बस यह सुनिश्चित करें कि यह 4 रिक्त स्थान या अधिक से प्रेरित है।
Mat

दूसरी समस्या यह है कि आपके द्वारा चिपकाए गए कोड में TAB वर्ण थे। यह स्वरूपण को गड़बड़ कर देता है।
स्टीफन सी

ओकी धन्यवाद, ग्रहण इंडेंटेशन में टैब का उपयोग करता है इसलिए जब मैं कॉपी पेस्ट करता हूं तो यह चीजों को गड़बड़ कर देता है। संपादन के लिए धन्यवाद
जेसन रोजर्स

ग्रहण का उपयोग किया जा सकता है और खरोज के लिए TAB वर्णों का उपयोग नहीं करने के लिए फिर से जोड़ा जाना चाहिए । कृपया इसे एक बहाने के रूप में उपयोग न करें।
स्टीफन सी

जवाबों:


137

यह जावा द्वारा अवरुद्ध क्यों है?

आपको जावा डिजाइनरों से पूछना होगा। प्रतिबंध के कुछ सूक्ष्म व्याकरणिक कारण हो सकते हैं। ध्यान दें कि कुछ सरणी निर्माण / आरंभीकरण निर्माण जावा 1.0 में नहीं थे, और जावा 1.1 में (IIRC) जोड़े गए थे।

लेकिन "क्यों" सारहीन है ... प्रतिबंध वहाँ है, और आपको इसके साथ रहना होगा।

मुझे पता है कि इसके आसपास कैसे काम करना है, लेकिन समय-समय पर यह सरल होगा।

आप इसे लिख सकते हैं:

AClass[] array;
...
array = new AClass[]{object1, object2};

9
w / o नई घोषणा में स्टेटमेंट ब्लॉक और एरे इनिशियलाइज़र (जैसे जावास्क्रिप्ट में, जो भ्रामक हो सकता है) के बीच कोई अंतर नहीं होगा
bestsss

10
यह भ्रामक होगा ... और पार्स करना कठिन। विचार करें कि {o1()}क्या एक वैध अभिव्यक्ति थी और {o1();}एक मान्य स्टेट ब्लॉक था। Parser को '}' या ';' पर जाना है। इससे पहले कि वह दो मामलों को भेद सके। व्याकरणिक मुद्दा सूक्ष्म नहीं है !!
स्टीफन C

19

मैं क्यों सवाल का जवाब देने की कोशिश करूँगा: ArrayList जैसी कक्षाओं की तुलना में जावा सरणी बहुत सरल और अल्पविकसित है, जो अधिक गतिशील हैं। जावा घोषणा समय पर जानना चाहता है कि सरणी के लिए कितनी मेमोरी आवंटित की जानी चाहिए। एक ArrayList बहुत अधिक गतिशील है और इसका आकार समय के साथ भिन्न हो सकता है।

यदि आप अपने सरणी को दो की लंबाई के साथ प्रारंभ करते हैं, और बाद में यह पता चलता है कि आपको तीन की लंबाई की आवश्यकता है, तो आपको जो मिला है उसे फेंक देना होगा और एक नया सरणी बनाना होगा। इसलिए 'नया' कीवर्ड।

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

मैं कहूंगा कि (और अगर कोई बेहतर जानता है, तो कृपया मुझे सुधारें) पहला उदाहरण

AClass[] array = {object1, object2}

वास्तव में मतलब है

AClass[] array = new AClass[]{object1, object2};

लेकिन जावा डिजाइनरों ने जो किया, वह यह था कि यदि आप घोषणा के समय पर सरणी बनाते हैं, तो इसे लिखने का तेज़ तरीका बनाना होगा।

सुझाए गए वर्कअराउड अच्छे हैं। यदि रनटाइम के समय या मेमोरी का उपयोग महत्वपूर्ण है, तो सरणियों का उपयोग करें। यदि यह महत्वपूर्ण नहीं है, और आप ऐसा कोड चाहते हैं जो समझने में आसान हो और साथ काम करना हो तो ArrayList का उपयोग करें।


2
यह एक शॉर्टकट है जैसा आपने बताया है, Oracle उद्धृत करते हुए: "वैकल्पिक रूप से, आप एक सरणी बनाने और शुरू करने के लिए शॉर्टकट सिंटैक्स का उपयोग कर सकते हैं" । शायद इसका कारण यह हो सकता है कि किसी बिंदु पर नए का उपयोग करके किसी सरणी को स्मृति में कुछ स्थान दिया जाना चाहिए । शॉर्टकट में नया निहित है, लेकिन शॉर्टकट केवल घोषणा में मान्य है। कहीं और, कोई शॉर्टकट की अनुमति नहीं है, और नया अनिवार्य है।
मिनट

3
मुझे खेद है, लेकिन "क्यों" प्रश्न का उत्तर देने के आपके प्रयास में पानी नहीं है। संकलक बाहर काम करने के कितना बड़ा सरणी के बीच भाव की गणना के द्वारा होने की जरूरत में सक्षम हो जाएगा {और }... जैसे यह प्रारंभकर्ता रूपों है कि अनुमति दी जाती है के लिए करता है।
स्टीफन सी

8

मैं भाग क्यों नहीं दे सकता।

लेकिन अगर आप कुछ गतिशील चाहते हैं तो आप संग्रह ArrayList पर विचार क्यों नहीं करते।

ArrrayList किसी भी ऑब्जेक्ट प्रकार का हो सकता है।

और अगर एक मजबूरी के रूप में आप इसे एक सरणी के रूप में चाहते हैं, तो आप उस पर ऐरा () पद्धति का उपयोग कर सकते हैं।

उदाहरण के लिए:

            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);

मुझे उम्मीद है कि यह आपकी मदद कर सकता है।


2
स्ट्रिंग [] के लिए एरे के रिटर्न प्रकार को डालने की कोई आवश्यकता नहीं है। अनुबंधित करके ऐरे उसी प्रकार का है जो निर्दिष्ट एरे के रूप में है। docs.oracle.com/javase/6/docs/api/java/util/…
अंकुर अग्रवाल

4

आप में से जो इस राक्षसी new AClass[] { ... }वाक्य रचना को पसंद नहीं करते हैं , उनके लिए यहाँ कुछ चीनी है:

public AClass[] c(AClass... arr) { return arr; }

इस छोटे से समारोह का उपयोग करें जैसा आप चाहते हैं:

AClass[] array;
...
array = c(object1, object2);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.