2016-08-10 16 views
6

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

मैं बस सोच रहा था कि जावा में एक समान कार्य मौजूद है या नहीं? या मौजूदा जावा वर्ग में अतिरिक्त विधियों को जोड़ने का यह एकमात्र तरीका मौजूदा वर्ग का उप-वर्ग बनाना है?

+2

जावा में नहीं। हालांकि स्कैला में हर कोई खुश नहीं है। क्योंकि यह पठनीयता, रखरखाव में बाधा डाल सकता है। आम तौर पर XxxUtils या Xxxs जैसे कार्यों के साथ एक वर्ग बनाता है। विरासत में इसकी अपनी समस्याएं हैं (अंतिम कक्षाएं, पुरानी कोड की मजबूती से अप्रचलितता, केंद्रीकरण = केवल एक विस्तार बिंदु)। –

उत्तर

5

नहीं, वेनिला जावा में विस्तार विधियां नहीं हैं। हालांकि, Lombok कई उपयोगी विशेषताएं जोड़ता है - विस्तार विधियों वाक्यविन्यास सहित - इसकी टिप्पणियों और बाइटकोड पीढ़ी के लिए धन्यवाद।

आप मौजूदा विधियों को विस्तार विधियों में "रूपांतरित" करने के लिए अपने @ExtensionMethod एनोटेशन का उपयोग कर सकते हैं। स्थिर तरीकों का पहला पैरामीटर मूल रूप से this बन जाता है। - जब तक स्थिर विधि अशक्त-सुरक्षित है के रूप में, NullPointerException फेंका नहीं किया जाएगा

import lombok.experimental.ExtensionMethod; 

@ExtensionMethod({java.util.Arrays.class, Extensions.class}) 
public class ExtensionMethodExample { 
    public String test() { 
    int[] intArray = {5, 3, 8, 2}; 
    intArray.sort(); 

    String iAmNull = null; 
    return iAmNull.or("hELlO, WORlD!".toTitleCase()); 
    } 
} 

class Extensions { 
    public static <T> T or(T obj, T ifNull) { 
    return obj != null ? obj : ifNull; 
    } 

    public static String toTitleCase(String in) { 
    if (in.isEmpty()) return in; 
    return "" + Character.toTitleCase(in.charAt(0)) + 
     in.substring(1).toLowerCase(); 
    } 
} 

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

इसके अलावा, आप जावा इंटरऑपरेबिलिटी के साथ कुछ अन्य जेवीएम भाषा का उपयोग कर सकते हैं, अगर यह आपके प्रोजेक्ट में ठीक है। उदाहरण के लिए, Kotlinextension methods functionality के साथ आता है, साथ ही मानक लाइब्रेरी में पहले से परिभाषित कुछ उपयोगी एक्सटेंशन भी आते हैं। यहां एक Kotlin and Lombok comparison है।

1

Decorator Pattern शायद निकटतम मैच है। यह मौजूदा वर्ग 'फ़ंक्शन को बढ़ाने के लिए प्रकार संगतता और संरचना को बनाए रखने के लिए इंटरफ़ेस का उपयोग करता है। यह वही सिद्धांत नहीं है जैसा आप वर्णन कर रहे हैं लेकिन एक ही उद्देश्य की सेवा कर सकते हैं।

2

यह जेएमवी के लिए अन्य भाषाओं में किया जा सकता है, जैसे स्कैला, Groovy या क्लोजर।

उदाहरण के लिए ग्रूवी में:

List.metaClass.printSize = { 
    println delegate.size() 
} 

[1,2,3].printSize() //prints 3 

स्काला में आप implicit conversions उपयोग कर सकते हैं:

class PrefixedString(val s: String) { 
    def prefix = "prefix_" + s 
} 

implicit def stringToString(s: String) = new PrefixedString(s) 

"foo".prefix // returns "prefix_foo" 

कृपया this article.

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

+1

इसके अलावा, लंबोक कुछ जादू आंतरिक रूप से करता है, लेकिन यह _is_ जावा है, इसलिए कह रहा है कि इसका "असंभव" बिल्कुल सही नहीं है। – JustACluelessNewbie

+1

ठीक है, टिप्पणियों के लिए धन्यवाद, मैंने अभी अपना awser अपडेट किया है। –

+0

स्कैला उदाहरण शायद 'निहित वर्ग' का उपयोग करना चाहिए जो 'AnyVal' बढ़ाता है – Clashsoft

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