जावा 8 डिफ़ॉल्ट तरीकों स्रोत संगतता है?

वोट
52

यह आम तौर पर मामला जावा स्रोत कोड आगे संगत कर दिया गया है किया गया है। जावा 8 तक, जहाँ तक मुझे पता है, दोनों संकलित वर्गों और स्रोत बाद में JDK / JVM रिलीज के साथ आगे संगत किया गया है। , डिफ़ॉल्ट तरीकों के अलावा जावा 8 में यह अब मामला प्रतीत होता है के साथ: [अपडेट यह सही नहीं है, 'enum' फिर से टिप्पणी आदि, नीचे देखें।] हालांकि।

उदाहरण के लिए, एक पुस्तकालय मैं उपयोग कर रहा है एक कार्यान्वयन की है java.util.Listएक भी शामिल है जो List<V> sort()। इस विधि अनुसार क्रमबद्ध सूची की सामग्री की एक प्रतिलिपि देता है। यह पुस्तकालय, एक जार फ़ाइल निर्भरता के रूप में तैनात किया, एक परियोजना JDK 1.8 का उपयोग कर बनाया जा रहा में ठीक काम किया।

हालांकि, बाद में मैं पुस्तकालय में ही पुन: संयोजित करने के लिए JDK 1.8 का उपयोग कर इस अवसर था और मैंने पाया पुस्तकालय नहीं रह गया है संकलित: Listअपने स्वयं के साथ -implementing वर्ग sort()विधि अब जावा 8 का विरोध करता java.util.List.sort()डिफ़ॉल्ट विधि। जावा 8 sort()डिफ़ॉल्ट विधि जगह में सूची सॉर्ट करता (रिटर्न void); मेरी लाइब्रेरी की sort()विधि - के बाद से यह एक नया अनुसार क्रमबद्ध सूची लौटाती है - एक असंगत हस्ताक्षर हैं।

तो मेरी बुनियादी सवाल यह है:

  • JDK 1.8 डिफ़ॉल्ट तरीकों की वजह से जावा स्रोत कोड के लिए एक आगे असंगति परिचय नहीं है?

इसके अलावा:

  • इस तरह की पहली आगे असंगत परिवर्तन है?
  • इस पर विचार किया या विचार-विमर्श किया गया था जब डिफ़ॉल्ट तरीकों जहां बनाया गया है और लागू किया? इसे कहीं भी दस्तावेज है?
  • (वैसे छोटे) असुविधा लाभ बनाम रियायती किया गया था?

निम्नलिखित कुछ कोड है कि संकलित करता है तथा 1.7 के तहत चलाता है और 1.8 के अधीन ही कार्य का एक उदाहरण है - लेकिन 1.8 के तहत संकलित नहीं करता है:

import java.util.*;

public final class Sort8 {

    public static void main(String[] args) {
        SortableList<String> l = new SortableList<String>(Arrays.asList(args));
        System.out.println(unsorted: +l);
        SortableList<String> s = l.sort(Collections.reverseOrder());
        System.out.println(sorted  : +s);
    }

    public static class SortableList<V> extends ArrayList<V> {

        public SortableList() { super(); }
        public SortableList(Collection<? extends V> col) { super(col); }

        public SortableList<V> sort(Comparator<? super V> cmp) {
            SortableList<V> l = new SortableList<V>();
            l.addAll(this);
            Collections.sort(l, cmp);
            return l;
        }

    }

}

निम्नलिखित शो इस कोड को संकलित (या करने में नाकाम रहने) और चलाने जा रहा है जा रहा है।

> c:\tools\jdk1.7.0_10\bin\javac Sort8.java

> c:\tools\jdk1.7.0_10\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted  : [this, test, is, a]

> c:\tools\jdk1.8.0_05\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted  : [this, test, is, a]

> del Sort8*.class

> c:\tools\jdk1.8.0_05\bin\javac Sort8.java
Sort8.java:46: error: sort(Comparator<? super V>) in SortableList cannot implement sort(Comparator<? super E>) in List
                public SortableList<V> sort(Comparator<? super V> cmp) {
                                       ^
  return type SortableList<V> is not compatible with void
  where V,E are type-variables:
    V extends Object declared in class SortableList
    E extends Object declared in interface List
1 error
02/07/2015 को 15:05
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
56

JDK 1.8 डिफ़ॉल्ट तरीकों की वजह से जावा स्रोत कोड के लिए एक आगे असंगति परिचय नहीं है?

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

इस तरह की पहली आगे असंगत परिवर्तन है?

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

इस पर विचार किया या विचार-विमर्श किया गया था जब डिफ़ॉल्ट तरीकों बनाया गया है और लागू किया गया? इसे कहीं भी दस्तावेज है?

हाँ, यह माना जाता था। देखें ब्रायन गोएज़ के अगस्त 2010 कागज सार्वजनिक रक्षक "तरीकों" "के माध्यम से इंटरफ़ेस विकास" :

  1. स्रोत अनुकूलता

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

(वैसे छोटे) असुविधा लाभ बनाम रियायती किया गया था?

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

लाभ के रूप में गोएज़ के कागज के शीर्ष पर उद्धृत,, असुविधाओं से बड़े होते हैं, हालांकि:

  1. समस्या का विवरण

प्रकाशित होने के बाद यह मौजूदा कार्यान्वयन को तोड़ने के बिना एक अंतरफलक के तरीकों को जोड़ने के लिए असंभव है। लंबे समय तक एक पुस्तकालय के बाद से समय प्रकाशित किया गया है, उतनी ही अधिक संभावना इस प्रतिबंध को इसकी देखरेख के लिए दु: ख का कारण होगा है।

JDK 7 जगह अतिरिक्त उम्र बढ़ने संग्रह इंटरफेस पर तनाव में जावा भाषा को बंद के अलावा; बंद का सबसे महत्वपूर्ण लाभ में से एक यह है कि यह अधिक शक्तिशाली पुस्तकालयों के विकास में सक्षम बनाता है। ऐसा नहीं है कि बेहतर पुस्तकालयों में सक्षम बनाता है, जबकि एक ही समय में मुख्य लाइब्रेरीज का विस्तार नहीं है कि सुविधा का लाभ लेने के लिए एक भाषा सुविधा को जोड़ने का निराशाजनक होगा।

02/07/2015 को 15:25
का स्रोत उपयोगकर्ता

वोट
9

JDK 1.8 डिफ़ॉल्ट तरीकों की वजह से जावा स्रोत कोड के लिए एक आगे असंगति परिचय नहीं है?

हाँ, आप अपने आप को देखा है के रूप में।

इस तरह की पहली आगे असंगत परिवर्तन है?

सं जावा 5 enumकीवर्ड इसलिए भी कि पहले तोड़ने गया था आप नामित चर हो सकता है कि जो अब जावा 5 में संकलन होगा +

इस पर विचार किया या विचार-विमर्श किया गया था जब डिफ़ॉल्ट तरीकों जहां बनाया गया है और लागू किया? इसे कहीं भी दस्तावेज है?

हाँ Orcale जावा 8 स्रोत असंगति वर्णन

(वैसे छोटे) असुविधा लाभ बनाम रियायती किया गया था?

हाँ

02/07/2015 को 15:12
का स्रोत उपयोगकर्ता

वोट
3

हम सार वर्ग के साथ एक समानांतर आकर्षित कर सकते हैं। एक सार वर्ग subclassed जा करने के लिए इतना है कि सार तरीकों लागू किया जा सकता का इरादा है। सार वर्ग ही ठोस तरीके कि सार विधियां प्रारंभ होता है। सार वर्ग और अधिक ठोस विधियां जोड़कर विकसित करने के लिए नि: शुल्क है; और इस अभ्यास उपवर्गों टूट सकता है।

इसलिए सटीक समस्या आप वर्णित भी Java8 से पहले ही अस्तित्व में। समस्या और अधिक संग्रहण API पर प्रकट होता है, क्योंकि वहाँ जंगली में बाहर उपवर्गों के एक बहुत हैं।

डिफ़ॉल्ट विधि के अग्रणी प्रेरणा उपवर्गों को तोड़ने के बिना मौजूदा संग्रहण API करने के लिए कुछ उपयोगी तरीकों को जोड़ने के लिए था, वे उपवर्गों को तोड़ने के डर से बहुत ज्यादा यह कर रही है, के महान आत्म नियंत्रण व्यायाम करने के लिए किया था। एक डिफ़ॉल्ट विधि जोड़ा जाता है केवल अगर यह बिल्कुल जरूरी है। क्यों यहाँ असली सवाल है, List.sortबिल्कुल जरूरी माना जाता है। मुझे लगता है कि यह बहस का मुद्दा है।

क्यों डिफ़ॉल्ट विधि 1 जगह में पेश किया गया था की परवाह किए बिना, यह अब एपीआई डिजाइनरों के लिए एक महान उपकरण है, और हम सार कक्षाओं में ठोस तरीके के रूप में यह एक ही इलाज के लिए चाहिए - वे ध्यान से सामने तैयार किया जा करने की जरूरत है; और नए बहुत सावधानी के साथ पेश किया जाना चाहिए।

02/07/2015 को 17:10
का स्रोत उपयोगकर्ता

वोट
2

विडंबना यह है कि इंटरफेस में डिफ़ॉल्ट तरीकों उन इंटरफेस का उपयोग कर मौजूदा पुस्तकालयों अनुमति देने के लिए शुरू किए गए थे नहीं है, जबकि बड़े पैमाने पर शुरू करने, तोड़ने के लिए नया इंटरफेस में कार्यक्षमता। (अनिच्छुक अनुकूलता।)

ऐसे ही संघर्ष sortविधि पैदा हो सकता है। कुछ अतिरिक्त कार्यक्षमता के लिए भुगतान करने के लिए। अपने मामले भी जांच करने के लिए कुछ में (नई कार्यक्षमता के बजाय इस्तेमाल किया जाना चाहिए?)।

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

02/07/2015 को 15:32
का स्रोत उपयोगकर्ता

वोट
0

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

19/02/2017 को 07:39
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more