2012-03-16 6 views
39

वर्तमान में मैं पढ़ रहा हूँ "व्यवहार में जावा संगामिति" है, जो इस वाक्य में शामिल हैं:जावा में स्टेटलेस ऑब्जेक्ट क्या है?

एक राज्यविहीन वस्तु तक पहुँचने अन्य थ्रेड पर कार्रवाई की शुद्धता, राज्यविहीन वस्तुओं को प्रभावित नहीं कर सकते हैं एक धागे की कार्रवाई के बाद से सुरक्षित धागा।

तो, स्टेटलेस ऑब्जेक्ट क्या है?

उत्तर

63

स्टेटलेस ऑब्जेक्ट उदाहरण के बिना कक्षा (उदाहरण चर) के एक वर्ग का एक उदाहरण है। कक्षा फ़ील्ड हो सकती है, लेकिन वे संकलन-समय स्थिरांक (स्थिर अंतिम) हैं।

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

+14

यदि किसी ऑब्जेक्ट में कोई फ़ील्ड (गैर स्थैतिक) है, तो इसमें एक राज्य है। यदि यह अपरिवर्तनीय है, तो यह वास्तव में एक राज्य है, लेकिन स्टेटलेस नहीं है। – assylias

+0

@assylias I बस तय किया है कि – Bozho

+0

@ om-nom-nom का उत्तर बहुत गहराई से स्पर्श करता है। – user2351818

2

राज्य के बिना एक वस्तु, उदाहरण चर बदल सकते हैं और क्या पहले से ही वस्तु

38

हुआ है पर निर्भर करता है वस्तु किसी भी दृष्टांत फ़ील्ड, यह इसके राज्यविहीन नहीं है, तो भिन्न हो सकते हैं की तरह। यदि यह कुछ फ़ील्ड है तो यह स्टेटलेस भी हो सकता है, लेकिन उनके मूल्य ज्ञात हैं और नहीं बदलते हैं।

class Stateless { 
    void test() { 
     System.out.println("Test!"); 
    } 
} 

यह भी एक राज्यविहीन वस्तु है:

यह एक राज्यविहीन वस्तु है

class Stateless { 
    //No static modifier because we're talking about the object itself 
    final String TEST = "Test!"; 

    void test() { 
     System.out.println(TEST); 
    } 
} 

इस वस्तु राज्य है, इसलिए यह नहीं राज्यविहीन है। हालांकि, यह अपने राज्य में केवल एक बार की स्थापना की है, और इसे बाद में बदल नहीं करता है, वस्तुओं के इस प्रकार अपरिवर्तनीय कहा जाता है:

class Immutable { 
    final String testString; 

    Immutable(String testString) { 
     this.testString = testString; 
    } 

    void test() { 
     System.out.println(testString); 
    } 
} 
+1

"इसमें कुछ फ़ील्ड हैं, लेकिन यह ज्ञात है कि वे कभी नहीं बदलते हैं।" यह अपरिवर्तनीय होगा, स्टेटलेस नहीं – assylias

+1

@assylias जरूरी नहीं है। यदि ये फ़ील्ड स्थिरांक हैं, और वे संकलन समय पर सेट हैं, तो हम हमेशा उनके मूल्यों को जानते हैं। इसका प्रभावी अर्थ यह है कि ऑब्जेक्ट में कोई भी राज्य जानकारी नहीं है। – Malcolm

+1

स्टेटलेस ऑब्जेक्ट्स में कोई राज्य नहीं है। खेतों के साथ अपरिवर्तनीय वस्तुएं एक अलग राज्य में परिवर्तित नहीं हो सकती हैं, जिससे वे एक ही स्थिति में हैं। – assylias

1

एक राज्यविहीन वस्तु एक वस्तु है कि किसी भी आंतरिक स्थिति नहीं है (है आंतरिक चर)

0

ऐसी वस्तुएं जिनमें बिल्कुल कोई स्थिति नहीं है, उन्हें का उपयोग करने में कोई समस्या नहीं है, सवाल यह है कि: यदि उनके पास बिल्कुल कोई राज्य नहीं है, तो सभी विधियों को स्थिर क्यों न बनाएं और कभी भी कोई भी न बनाएं?

+0

"अगर उनके पास बिल्कुल कोई राज्य नहीं है, तो सभी विधियों को स्थिर क्यों नहीं बनाते और कभी भी कोई भी नहीं बनाते?" ---- हमें पॉलिमॉर्फिज्म को ध्यान में रखना चाहिए। या केवल ओओ के नियम को ध्यान में रखें - 'अमूर्त से कार्यान्वयन को अलग करना'। ओओ डिज़ाइन में यह आम है कि हमारे पास इंटरफेस है जो एक अमूर्तता का प्रतिनिधित्व करता है, जबकि हमारे पास कई कार्यान्वयन हो सकते हैं ---- कक्षाएं जो हमारे इंटरफ़ेस को लागू करती हैं। इस मामले में, भले ही कार्यान्वयन वर्ग स्टेटलेस है, केवल एक स्थिर विधियों वाला वर्ग काम नहीं करता है क्योंकि यह हमारे इंटरफेस को लागू नहीं कर सकता है। – user2351818

2

स्टेटलेस ऑब्जेक्ट की अवधारणा side effects की अवधारणा के साथ अत्यधिक है। संक्षेप में, वह ऑब्जेक्ट है जिसमें कोई फ़ील्ड नहीं है जिसके अंतर्गत अलग-अलग मान हो सकते हैं, निर्भर रूप से विधि कॉल के विभिन्न क्रम पर निर्भर करते हैं।

1

बस एक स्पष्टीकरण। आप अपनी कक्षा को पहले बताए गए तरीके से स्टेटलेस के रूप में देख सकते हैं, भले ही यह एक चर वैरिएबल है, जहां तक ​​यह चर अंतिम और अपरिवर्तनीय है।

यदि आवृत्ति चर केवल अंतिम लेकिन उत्परिवर्तनीय है, उदाहरण के लिए स्ट्रिंग्स की एक सूची, हाँ वैरिएबल का संदर्भ बदला नहीं जा सकता है लेकिन सूची की सामग्री और इस प्रकार वर्ग की स्थिति बदल दी जा सकती है।

0

यदि आप कोई पैरामीटर या मूल्य इत्यादि नहीं बदल सकते हैं।किसी ऑब्जेक्ट के बाद, इसके निर्माण के बाद, वह ऑब्जेक्ट थ्रेड-सुरक्षित है।