2011-01-04 5 views
5

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

public class Circle { 
    final double x, y; // location 
    final double radius; 

    public Circle(double x, double y, double r) { 
    this.x = x; 
    this.y = y; 
    this.r = r; 
    } 

    // method for creating a new instance, moved in x-axis by specified amount 
    public Circle withOffset(double deltaX) { 
    return new Circle(x+deltaX, y, radius); 
    } 
} 

तो: "ऑफ़सेट" के साथ विधि क्या होनी चाहिए? (ध्यान दें: इसका नाम क्या नहीं होना चाहिए - लेकिन इस वर्ग के तरीकों को क्या कहा जाता है)। तकनीकी रूप से यह एक कारखाना विधि है, लेकिन किसी भी तरह से यह मेरे लिए बिल्कुल सही नहीं लगता है, क्योंकि अक्सर कारखानों को मूल गुण दिए जाते हैं (और या तो स्थिर तरीके हैं, या परिणाम प्रकार के सदस्य नहीं हैं लेकिन कारखाने के प्रकार हैं)।

तो मुझे लगता है कि इस तरह के तरीकों के लिए एक बेहतर शब्द होना चाहिए। चूंकि इन विधियों का उपयोग "fluent interface" को लागू करने के लिए किया जा सकता है, हो सकता है कि वे "धाराप्रवाह फैक्ट्री विधियां" हो सकें? बेहतर सुझाव?

संपादित करें: जैसा कि उत्तर में से एक द्वारा सुझाया गया है, java.math.BigDecimal इसके 'एड', 'घटाव' (आदि) विधियों के साथ एक अच्छा उदाहरण है।

इसके अलावा: मैंने देखा वहाँ (जॉन स्कीट से कम नहीं) है कि this question वह यह है कि एक तरह से संबंधित

संपादित करें (हालांकि यह विधि के लिए के बारे में विशिष्ट नाम पूछता है), मई-2014: मेरे वर्तमान पसंदीदा mutant factory, FWIW है ।

+0

मैं इसे एक खराब नामित विधि कहूंगा। – Falmarri

+0

"चाल" और "डेल्टा" मौजूदा उदाहरण के गुणों की व्यवहार्यता को दर्शाता है ... – BoltClock

+0

कृपया वास्तविक प्रश्न पढ़ें - मैंने नहीं पूछा कि तरीकों का नाम कैसे दिया जाए, लेकिन किस तरह के तरीकों को कॉल करना है। लेकिन दूसरों को अलगाव पर जाने से रोकने के लिए मैं थोड़ा सा कोड संपादित करूंगा। – StaxMan

उत्तर

3

मैं उन प्रकार के तरीकों को कॉल करता हूं "कॉपी विधियां"

जबकि clone() विधि एक सटीक प्रतिलिपि बनाता है, एक प्रति विधि एक उदाहरण की एक प्रति बनाता है, आमतौर पर एक अंतर्निहित या स्पष्ट भिन्नता के साथ। उदाहरण के लिए, String#toUpperCase() अपरिवर्तनीय स्ट्रिंग क्लास की प्रतिलिपि विधि होगी - यह एक भिन्नता के साथ एक उदाहरण की प्रतिलिपि बनाता है: यह सभी अक्षरों को ऊपर उठाता है।

मैं आपके उदाहरण में एक समान प्रति विधि होने के लिए withOffset() विधि पर विचार करता हूं।

मुझे किसी भी संदर्भ के बारे में पता नहीं है जो "कॉपी विधि" शब्द को दस्तावेज करता है। मैं सी ++ में अपने उपयोग से "प्रतिलिपि" शब्द उधार ले रहा हूं: प्रतिलिपि बनाने वाले और प्रतिलिपि बनाने वाले "कॉपी" नामांकन दिशानिर्देश तालिगेंट कोडिंग मानकों (more info) से।


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

+0

फ्लुएंट हिस्सा केवल एक सुझाव था, इस तथ्य के आधार पर कि इस तरह के तरीकों को अक्सर धाराप्रवाह शैली का समर्थन करने के लिए उपयोग किया जाता है। हालांकि यह समान नहीं है क्योंकि धाराप्रवाह शैली अपरिवर्तनीयता (या जरूरी रूप से बढ़ावा देने) को अनिवार्य नहीं है। "प्रतिलिपि विधि" उचित लगता है, चलो देखते हैं कि किसी के पास भी बेहतर सुझाव हैं। (मैं वास्तव में प्रश्न में संदर्भ के रूप में "कॉपी कन्स्ट्रक्टर" का उल्लेख करने वाला था, लेकिन संभव भ्रम को हटाने का प्रयास करने के लिए इसके खिलाफ फैसला किया) – StaxMan

1

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

तो यह एक कारखाने के डिजाइन द्वारा नहीं है। (इंटरफ़ेस निकालने और उस विधि के लिए जावाडोक लिखने के बारे में सोचें: "मुझे एक नया उदाहरण वापस करना होगा, क्योंकि मैं अपरिवर्तनीय हूं" - ऐसा क्यों ??) तथ्य यह है कि आपकी कक्षा अपरिवर्तनीय है केवल एक कार्यान्वयन विस्तार है)।

संपादित करें: पेराह एक बेहतर उदाहरण बिगइंटर होगा, क्योंकि यह भी अपरिवर्तनीय है।

BigInteger multiply(long v) 

जो एक नया उदाहरण देता है और बहुत अच्छी तरह से अपने मामले जैसा दिखता है: गुणा (BigInteger) के साथ, यह एक पैकेज-निजी तरीका प्रदान करता है। यह केवल एक ऑपरेशन है जो प्रारंभिक वस्तु के समान प्रकार के परिणाम को वापस करने के लिए होता है; एक कारखाना नहीं है और मुझे नहीं लगता कि इस तरह के ऑपरेशन वास्तव में अपने नाम का हकदार है।

+0

मैं इस बात से सहमत हूं कि यह एक कारखाना विधि नहीं है , यही कारण है कि मैं एक बेहतर शब्द खोजने की उम्मीद कर रहा था। BigInteger एक अच्छा उदाहरण है। लेकिन इसके अलावा, ध्यान दें कि अपरिवर्तनीयता यहां एक बहुत ही महत्वपूर्ण पहलू है; और निश्चित रूप से (केवल) एक कार्यान्वयन विस्तार नहीं - पूरी वस्तु अपरिवर्तनीय होनी चाहिए, न केवल इस विधि के साथ संचालन। शायद आप अपरिवर्तनीय वस्तु शैली या लाभ से परिचित नहीं हैं? यह बहु थ्रेडिंग और समवर्ती डेटा संरचनाओं के साथ जबरदस्त मदद करता है। स्ट्रिंगबिल्डर के साथ, उदाहरण की वापसी केवल एक सुविधा चीज है जो चेनिंग की अनुमति देती है। – StaxMan

+0

मैंने कभी नहीं कहा कि विधि अपरिवर्तनीय है, अपरिवर्तनीयता मेरे पोस्ट में आपकी मंडल कक्षा की वस्तुओं को संदर्भित करती है। मैंने कहा "कार्यान्वयन विस्तार" क्योंकि मैं इसे वर्गीकृत करने और वास्तविक कार्यान्वयन को अनदेखा करने के लिए उस विधि को देखने की कोशिश कर रहा हूं। मैं बस इतना कह रहा हूं कि अगर यह एक अमूर्त विधि (एक इंटरफ़ेस में घोषित) था, तो यह संभावना नहीं है कि आपको इस तरह व्यवहार करने के लिए _all_ कार्यान्वयन की आवश्यकता होगी। इसलिए, मुझे लगता है कि इस विधि के लिए यह व्यवहार आवश्यक नहीं है। –

+0

मुझे लगता है कि मुझे एक बेहतर उदाहरण मिला: String.concat() - हालांकि यह CharSequence इंटरफ़ेस से नहीं आता है। जावाडोक कहता है: "यदि तर्क स्ट्रिंग की लंबाई 0 है, तो यह स्ट्रिंग ऑब्जेक्ट वापस कर दिया गया है"। यदि एक्स ऑफसेट 0 है तो आप वही कर सकते हैं, इसलिए एक नई वस्तु भी एक आवश्यकता नहीं है। –

3

एचआरएम ... यह वस्तु के उत्परिवर्तित संस्करण बनाता है ... शायद हमें इसे एक उत्परिवर्ती कारखाना कहना चाहिए? :-)

+0

हे, मुझे वह पसंद है। :) – StaxMan

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