जावा विधि घोषणा में अधिकतम पैरामीटर


133

जावा में एक विधि के अधिकतम पैरामीटर क्या हो सकते हैं और क्यों?

मैं 64-बिट विंडोज सिस्टम पर जावा 1.8 का उपयोग कर रहा हूं।

इस बारे में स्टैकऑवरफ्लो के सभी जवाबों में कहा गया है कि तकनीकी सीमा 255 मापदंडों की वजह से बताए बिना क्यों है।

सटीक होने के लिए, स्थैतिक के लिए 255 और गैर-स्थैतिक के लिए 254 ( thisइस मामले में 255 वां होगा) तरीके।

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

लेकिन यह केवल intऔर सभी 4-बाइट प्रकारों के लिए मान्य था । मैंने longमापदंडों के साथ कुछ परीक्षण किए , और मैं केवल उस मामले में 127 मापदंडों की घोषणा करने में सक्षम था।

Stringमापदंडों के साथ , मुझे परीक्षण से कटौती की गई अनुमत संख्या 255 है (यह हो सकता है क्योंकि संदर्भ आकार जावा में 4 बाइट्स है)।

लेकिन चूंकि मैं 64-बिट सिस्टम का उपयोग कर रहा हूं, इसलिए संदर्भ आकार 8 बाइट्स चौड़ा होना चाहिए और इसलिए Stringमापदंडों के साथ अधिकतम अनुमत संख्या 127 होनी चाहिए, longप्रकारों के समान ।

यह सीमा कैसे लागू होती है?

क्या विधि के स्टैक आकार के साथ सीमा का कोई लेना देना है ?

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


39
7, यदि आप पठनीयता के साथ पागल नहीं होना चाहते हैं। (मुझे पता है कि आप वास्तव में क्या पूछ रहे हैं)।
एडम

14
मैं बहस करूंगा <= 4। अधिक कुछ भी संभवतः एक वस्तु में लपेटा जाना चाहिए।
विविन पालीथ

4
यह एक दिलचस्प सवाल क्यों है? यदि आप एक प्रोग्राम लिख रहे हैं और आप इस सीमा तक पहुँच रहे हैं, तो आपका डिज़ाइन गलत है। मुझे समझ में नहीं आता है कि इस तरह के व्यावहारिक रूप से बेकार प्रश्न इतने सारे अपवित्र हो जाते हैं।
जेसपर

20
@ जेस्पर क्योंकि यह सवाल जेवीएम विनिर्देश के ज्ञान पर सवाल उठाता है। यह सवाल नहीं पूछता "यह या वह कैसे करें?" इसके बजाय यह सवाल है कि "मुझे इसकी आवश्यकता क्यों है?" ... +1 दिलचस्प सवाल Userv
अमित

2
@ मैं बिल्कुल वही सोच रहा था जो मैं सोच रहा था। ओपी बस इसके बारे में उत्सुक था।
इवान कार्सलेक

जवाबों:


110

यह सीमा JVM विशिष्टता में परिभाषित की गई है :

विधि मानकों की संख्या 255 तक ही सीमित है एक विधि वर्णनकर्ता (§4.3.3), जहां सीमा के लिए एक इकाई भी शामिल की परिभाषा के द्वारा इस उदाहरण या इंटरफ़ेस विधि आमंत्रण के मामले में।

अनुभाग Section4.3.3 कुछ अतिरिक्त जानकारी देता है:

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

कुल लंबाई की गणना व्यक्तिगत मापदंडों के योगदान को संक्षेप में की जाती है, जहां टाइप लॉन्ग या डबल का एक पैरामीटर लंबाई में दो इकाइयों का योगदान देता है और किसी अन्य प्रकार के पैरामीटर में एक इकाई का योगदान होता है

आपकी टिप्पणियों पर स्थान दिया गया था, दोहरे शब्द आदिम ( long/ double) को सामान्य 4 बाइट्स चर और 4 बाइट ऑब्जेक्ट ऑब्जेक्ट संदर्भों के आकार के दोगुने की आवश्यकता होती है ।

64 बिट सिस्टम से संबंधित आपके प्रश्न के अंतिम भाग के बारे में, विनिर्देश परिभाषित करता है कि कितने यूनिट एक पैरामीटर का योगदान करते हैं , विनिर्देश के उस हिस्से को अभी भी 64 बिट प्लेटफॉर्म पर भी अनुपालन करना होगा , 64 बिट जेवीएम 255 आवृत्ति पैरामीटर (जैसे आपके 255 Strings) आंतरिक वस्तु के सूचक आकार की परवाह किए बिना।


10
मैं इस जवाब में जोड़ता हूं कि 64 बिट आर्किटेक्चर पर स्टैक भी 64 बिट है। इसलिए, चूंकि पैरामीटर काउंट पर सीमा स्टैक साइज बाउंड है, 64-बिट स्टैक समान 255 ऑब्जेक्ट संदर्भों को संग्रहीत करने की अनुमति देता है। सिस्टम आर्किटेक्चर का विशिष्ट उपचार longऔर doubleपरवाह किए बिना, कल्पना के कई स्थानों में होता है और 32-बिट युग का अवशेष प्रतीत होता है।
सर्गेई

मैं सिर्फ उस हिस्से को संपादित करने की प्रक्रिया में था :) सहमत थे, अलग-अलग प्लेटफार्मों पर भी कल्पना का सम्मान किया जाना चाहिए।
अम्बर्टो रायमोंडी

1
हाँ, यदि मापदंडों की संख्या शब्द-आकार का एक कार्य थी, तो यह पोर्टेबिलिटी को तोड़ देगा; आप एक ही जावा प्रोग्राम को विभिन्न आर्किटेक्चर पर सफलतापूर्वक संकलित नहीं कर सकते।
विविन पालीथ

3
Varargs को ऑब्जेक्ट सरणी में बदल दिया जाता है , इसे पैरामीटर सूची में केवल एक बार उपयोग किया जा सकता है और अंतिम स्थिति पर कब्जा कर सकता है। इस सब को ध्यान में रखते हुए, मैं कहूंगा कि वेरिएग्स के उपयोग से मापदंडों की संख्या को 254 + Integer.MAX_VALUE तक बढ़ाया जा सकता है (कम से कम प्रोग्रामर के लिए ... पैरामीटर अभी भी 255 हैं), इसलिए उस ट्रिक का उपयोग करके आप इंटीजर का उपयोग कर सकते हैं। MAX_VALUE ऑब्जेक्ट पैरामीटर।
उबर्टो रायमोंडी

1
@MrTsjolder varargs के इस उत्तर पर एक नज़र डालें ।
विविन पालीथ

11

जेवीएम विनिर्देश की धारा 4.3.3 में वह जानकारी है जिसकी आपको तलाश है:

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

इसलिए यह प्रतीत होता है कि मेजबान-मशीन 32-बिट है या 64-बिट का मापदंडों की संख्या पर कोई प्रभाव नहीं है। यदि आप ध्यान दें, तो प्रलेखन "इकाइयों" के संदर्भ में बोलता है, जहां एक "इकाई" की लंबाई शब्द-आकार का एक कार्य है। यदि मापदंडों की संख्या सीधे शब्द-आकार के अनुपात में होती है, तो पोर्टेबिलिटी मुद्दे होंगे; आप विभिन्न आर्किटेक्चर पर एक ही जावा प्रोग्राम को संकलित करने में सक्षम नहीं होंगे (यह मानते हुए कि बड़े शब्द-आकार के साथ कम से कम एक विधि ने आर्किटेक्चर पर मापदंडों की अधिकतम संख्या का उपयोग किया है)।


10

मुझे इस बारे में एक समाचार पत्र से एक दिलचस्प मुद्दा मिला, http://www.javaspecialists.eu/archive/Issue059.html

प्रति वर्ग या प्रति-इंटरफ़ेस निरंतर पूल ClassFile संरचना के 16-बिट स्थिरांक_कुल_ क्षेत्र द्वारा 65535 प्रविष्टियों तक सीमित है। यह एकल वर्ग या इंटरफ़ेस की कुल जटिलता पर एक आंतरिक सीमा के रूप में कार्य करता है। गैर-मूल, गैर-अमूर्त विधि के अनुसार कोड की मात्रा 65536 बाइट्स में कोड के अपवाद के आकार से होती है।

विधि के आह्वान पर बनाए गए एक फ्रेम के स्थानीय चर सरणी में स्थानीय चर की सबसे बड़ी संख्या विधि के कोड देने वाले कोड विशेषता के अधिकतम_लोकल्स आइटम के आकार द्वारा 65535 तक सीमित है। ध्यान दें कि टाइप लॉन्ग और डबल के मानों को प्रत्येक को दो स्थानीय चर आरक्षित करने के लिए माना जाता है और मैक्स_लोकल मान के लिए दो इकाइयों का योगदान देता है, इसलिए उन प्रकारों के स्थानीय चर का उपयोग इस सीमा को और कम कर देता है।

फ़ील्ड या इंटरफ़ेस द्वारा घोषित किए जा सकने वाले फ़ील्ड की संख्या, क्लासफाइल संरचना के फ़ील्ड_काउंट आइटम के आकार द्वारा 65535 तक सीमित है। ध्यान दें कि ClassFile संरचना के फ़ील्ड_काउंट आइटम के मूल्य में वे फ़ील्ड शामिल नहीं हैं जो सुपरक्लास या सुपरनैफ़ेफ़स से विरासत में मिले हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.