2009-06-07 9 views
6

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

जावा में कौन से विशिष्ट डिज़ाइन निर्णय इस तरह से किए जाने के लिए दस्तावेज किए गए हैं क्योंकि वे पसंदीदा डिजाइन निर्णय नहीं थे, बल्कि इसलिए कि पिछली संगतता का समर्थन करना आवश्यक था।

स्पष्ट मामला जेनेरिक है, जहां आप रनटाइम पर प्रकार पैरामीटर का पता नहीं लगा सकते हैं। (तो तुम ऐसा नहीं कर सकते:

public void addEmptyMember(List<?> someList) { 
     if (someList instanceof List<String>) { 
      ((List<String>) someList).add(""); 
     } 
} 

अन्य क्या ऐसे उदाहरण भाषा डिजाइन और मानक एपीआई

उत्तर

3

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

तीन विशेषताओं के बारे में मैं सोच सकता हूं (जेनेरिक मिरर के अलावा, जिसे आपने पहले ही उल्लेख किया है) जो पिछड़े संगतता के नाम पर समझौता करता था, लूप सिंटैक्स के लिए नया था, varargs , और autoboxing।

लूप सिंटैक्स के लिए नया शायद for (item in List) पढ़ना चाहिए था, लेकिन उसे in को आरक्षित शब्द में बनाना होगा। यह कई पिछड़ा संगतता समस्याओं का कारण बनता है, जिनमें से कम से कम यह तथ्य नहीं है कि System.in का नाम बदलना होगा।

varargs और autoboxing दोनों अस्पष्टता की संभावनाओं को जोड़ा। उदाहरण के लिए, यदि आप किसी विधि को ऑब्जेक्ट्स को पास करते हैं जो Object... स्वीकार करता है तो इसका मतलब है कि सरणी को vararg सरणी या vararg सरणी के तत्व के रूप में पास किया जाना चाहिए? ओवरलोड होने पर यह और भी जटिल हो जाता है। ऑटोबॉक्सिंग में ओवरलोडिंग के साथ समान अस्पष्टता की समस्याएं हैं। इन दोनों समस्याओं का समाधान यह नियम बनाना था कि विधि कॉल को हल करते समय उन्हें पहले 1.5 नियमों के साथ हल किया जाता है (यानी: कोई ऑटोबॉक्सिंग नहीं, और Object... को Object[] माना जाता है)। केवल अगर प्री-1.5 नियमों के साथ विधि कॉल को हल नहीं किया जा सकता है तो नए 1.5 नियम माना जाता है।

+0

क्या तीसरा व्यक्ति वास्तव में पिछड़ा संगतता के लिए एकमात्र/मुख्य कारण के रूप में चुना गया है? ऐसा लगता है कि यह दिमाग में पिछड़े संगतता के बावजूद भी समझ में आता है। –

+4

शुरुआत से भाषा में मौजूद varargs के किसी भी कार्यान्वयन में आप चाहते हैं कि "इस सरणी को विस्फोट करें और इसके तत्वों को varargs में तर्क के रूप में पास करें" के लिए एक अलग वाक्यविन्यास होना चाहिए।(उदाहरण के लिए, * अजगर में नोटेशन को कॉल करने का तर्क है, या यहां तक ​​कि लागू कार्य भी lisp में) वे जावा में ऐसा नहीं करना चाहते थे, हालांकि, क्योंकि वे मौजूदा एपीआई कार्यों को "अपग्रेड" करने में सक्षम होना चाहते थे, सभी पुराने कॉलर्स (जो एक सरणी की उम्मीद है) होने के बावजूद अभी भी काम करते हैं। –

2

एक और सभी कक्षाओं और विधियों का होगा जो अब तक कई संस्करणों के लिए बहिष्कृत हैं, लेकिन बस दूर नहीं जाएंगे। सबसे उल्लेखनीय विभिन्न थ्रेड विधियां हैं, जिन्हें बहिष्कृत किया गया है।

+2

निश्चित रूप से सच है। मुझे याद है जब उन्होंने System.getenv() को परिणाम लौटने के बजाय अपवाद फेंक दिया - लेकिन उन्होंने पीछे की संगतता के लिए विधि को छोड़ दिया! – Yishai

+0

बैरिंग 'नष्ट' अन्य सभी बहिष्कृत थ्रेड विधियों के कुछ उपयोग हैं, सहित। रोकें/फिर से शुरू करें और रोकें हमेशा उपयोगी रहे हैं, यद्यपि दृढ़ता से निराश हैं। – bestsss

3

मानक पुस्तकालय

  • java.awt.Color अपर और लोअर केस के नाम के साथ एक ही स्थिरांक है में उदाहरण के बहुत सारे हैं
  • सभी java.util.Date में पदावनत तरीकों परिचय दिया java.util.Calendar - क्या गड़बड़ !!
  • java.util.Enumeration अभी भी इस्तेमाल किया जा रहा है, जहां java.util.Iterator यह स्विंग में
  • क्लासेस कि तर्क के रूप में वेक्टर स्वीकार की जगह सकता है, लेकिन समर्थन प्राप्त था हो सकता था java.util.Collection
संबंधित मुद्दे