2010-01-17 12 views
56

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

प्रश्न: विधि में स्थैतिक चर विधि को निष्पादित करते समय भी इसका मान रखता है लेकिन केवल इसकी विधि में पहुंच योग्य है लेकिन स्थैतिक विधि की सबसे अच्छी परिभाषा क्या है?

प्रश्न: उस वर्ग की वस्तु के बिना स्थिर विधि को कॉल करना स्थिर विधि का एकमात्र लाभ है?

प्रश्न: स्थैतिक विधि के लिए सुलभ सीमा क्या है?

धन्यवाद

+4

यह एसओ पर व्यापक रूप से चर्चा की गई है, http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423 और अन्य प्रश्नों की जांच करें जब आप "स्थैतिक विधि" खोजते हैं तो यह आता है। – PeterAllenWebb

उत्तर

58

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

एक गणित वर्ग पर विचार करें जिसमें कुछ सामान्य मूल्य जैसे पीआई या ई, और पाप और कॉस जैसे कुछ उपयोगी कार्य शामिल हैं। यह वास्तव में कार्यक्षमता इस तरह का उपयोग करने के लिए अलग उदाहरण बना करने के लिए कोई मतलब नहीं है, इस तरह वे स्टैटिक्स के रूप में बेहतर कर रहे हैं:

// This makes little sense 
Math m = new Math(); 
float answer = m.sin(45); 

// This would make more sense 
float answer = Math.sin(45); 

OO भाषाओं में (फिर से, एक जावा के नजरिए से) काम करता है, या बेहतर तरीके के रूप में जाना जाता है, स्थैतिक स्थानीय चर नहीं हो सकता है। केवल कक्षाओं में स्थिर सदस्य हो सकते हैं, जैसा कि मैंने कहा है, सी

+0

मुझे यकीन नहीं है कि मैं इस कथन से सहमत हूं "इस तरह की कार्यक्षमता का उपयोग करने के लिए यह अलग-अलग उदाहरण बनाने के लिए वास्तव में समझ में नहीं आता है, इस प्रकार वे स्टेटिक्स के रूप में बेहतर हैं" – Charbel

+0

@ मार्श के बारे में चार्बेल उदाहरण के लिए, स्थैतिक समझ में आता है, जब तक कि आप [नया गणित] लागू नहीं करते हैं (https://www.youtube.com/watch?v=UIKGV2cTgqA)। –

5

एक कक्षा में स्थिर विधि का उपयोग करने के लिए एकमात्र समय है जब किसी दिए गए विधि की आवश्यकता नहीं होती है एक कक्षा का एक उदाहरण बनाया जाना है। यह एक साझा डेटा स्रोत (जैसे सिंगलटन) को वापस करने का प्रयास कर रहा है या एक ऐसा ऑपरेशन कर रहा है जो ऑब्जेक्ट की आंतरिक स्थिति को संशोधित नहीं करता है (उदाहरण के लिए String.format)।

इस विकीपीडिया प्रविष्टि बहुत अच्छी तरह से स्थिर तरीकों बताते हैं: http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods

2

स्टेटिक चर और स्थिर तरीकों वर्ग के लिए बाध्य कर रहे हैं, और न वर्ग का एक उदाहरण।

स्थिर तरीकों में "राज्य" नहीं होना चाहिए। किसी राज्य से संबंधित कुछ भी, तत्काल वस्तु से बंधे होना चाहिए, न कि वर्ग।

8

अनिवार्य रूप से, स्थिर विधियां आपको किसी ऑब्जेक्ट उन्मुख भाषा में प्रक्रियात्मक कोड लिखने देती हैं। यह आपको पहले ऑब्जेक्ट बनाने के बिना विधियों को कॉल करने देता है।

2

Static Methods in PHP:

एक वर्ग वस्तु बनाने के बिना कहा जा सकता है।

केवल स्थिर विधियों और फ़ंक्शन पर कॉल कर सकते हैं।

15

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

इन्हें एक वर्ग में समेकित विधियों को समूहित करने के लिए या फैक्ट्री पैटर्न में अपनी कक्षा की वस्तुओं पर कार्य करने के लिए उपयोग किया जा सकता है।

11

सिंटेक्स (php) स्थिर तरीकों के लिए:

<?php 
class Number { 
    public static function multiply($a, $b) { 
     return $a * $b; 
    } 
} 
?> 

क्लाइंट कोड:

echo Number::multiply(1, 2); 

कौन सा अधिक भावना से करता है:

$number = new Number(); 
echo $number->multiply(1, 2); 

multiply() विधि किसी भी उपयोग नहीं करता है के रूप में कक्षा चर और इस तरह के Number के उदाहरण की आवश्यकता नहीं है।

+0

थोड़ा नाइटपिकिंग: संख्या एक संख्यात्मक मान का प्रतिनिधित्व करने वाली कक्षा की तरह लगता है, न कि गणित परिचालन प्रदान करने वाली उपयोगिता वर्ग। – RecursiveExceptionException

1

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

1

स्थैतिक तत्व किसी भी संदर्भ (यानी आपकी स्क्रिप्ट में कहीं भी) से पहुंच योग्य हैं, ताकि आप ऑब्जेक्ट से ऑब्जेक्ट तक कक्षा के उदाहरण को पास किए बिना इन विधियों तक पहुंच सकें।

स्टेटिक तत्व कक्षा के प्रत्येक उदाहरण में उपलब्ध हैं, इसलिए आप उन मानों को सेट कर सकते हैं जिन्हें आप किसी प्रकार के सभी सदस्यों के लिए उपलब्ध करना चाहते हैं।

आगे पढ़ने के लिए a link!

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