दिलचस्प पोस्ट
मैं PHP स्ट्रिंग में वर्णों से एक्सेन्ट कैसे निकालूं? Java.sql.ResultSet से कॉलम नाम पुनर्प्राप्त करें मैं कैसे मोंगोडीबी में समकक्ष सम्मिलित हों? एक सक्रिय रिकॉर्डिंग रिकॉर्ड का डुप्लिकेट सबसे आसान तरीका क्या है? Regex का उपयोग करने के बजाय स्ट्रिंग उत्पन्न करने के लिए उन्हें मैच क्यों रूबी में विभाजित दशमलव मान के बजाय एक पूर्णांक है? उद्देश्य-सी में #import और #include के बीच अंतर क्या है? CS0120: गैर-विशिष्ट क्षेत्र, विधि, या प्रॉपर्टी 'फू' के लिए ऑब्जेक्ट संदर्भ की आवश्यकता है गोल कोनों के साथ लेआउट कैसे बनाया जाए ..? एंड्रॉइड में एक फाइल कैसे बनाएं? PHP में सरणी तत्वों की कुंजी रीसेट करें? जावा में मूल्यांकन आदेश के लिए नियम क्या हैं? AppCompat v7 r21 values.xml में त्रुटि लौट रहा है? इसका मतलब क्या है जब C / C ++ में एक संख्यात्मक स्थिरांक 0 के साथ प्रीफ़िक्स है? जावा में वेबकैम से छवि कैप्चर करना?

विधियों के स्थिर आयात के लिए एक अच्छा उपयोग क्या है?

बस एक समीक्षा टिप्पणी मिली है कि विधि का मेरा स्थिर आयात अच्छा विचार नहीं था। स्थैतिक आयात डीए कक्षा से एक विधि का था, जिसमें ज्यादातर स्थिर तरीके थे। तो व्यापारिक तर्क के बीच में मुझे एक दा गतिविधि थी जो जाहिरा तौर पर वर्तमान वर्ग से संबंधित थी:

import static some.package.DA.*; class BusinessObject { void someMethod() { .... save(this); } } 

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

लेकिन अन्य कारण, जो मैं सहमत हूं, वह है कि एक अयोग्य विधि कॉल वर्तमान वस्तु से संबंधित है और प्रसंगों को नहीं छलांग चाहिए। लेकिन अगर यह वास्तव में संबंधित था, तो यह उस सुपर क्लास का विस्तार करने का अर्थ होगा।

तो, यह स्थिर आयात विधियों के लिए समझदारी कहां है? जब आप यह किया है? क्या आपको अयोग्य कॉल देखने का तरीका पसंद आया था?

संपादित करें: लोकप्रिय राय ऐसा लगता है कि स्थिर-आयात पद्धतियां यदि कोई उन्हें वर्तमान वर्ग के तरीकों के रूप में भ्रमित करने वाला नहीं है। उदाहरण के लिए java.lang.Math और java.awt.Color से तरीकों। लेकिन अगर अब्स और मिल अल्फा अस्पष्ट नहीं हैं तो मुझे नहीं पता है कि कर्मचारी क्यों पढ़ा है? बहुत सारे प्रोग्रामिंग विकल्पों के रूप में, मुझे लगता है कि यह भी एक निजी वरीयता बात है।

आपकी प्रतिक्रिया के लिए धन्यवाद दोस्तों, मैं सवाल बंद कर रहा हूँ

वेब के समाधान से एकत्रित समाधान "विधियों के स्थिर आयात के लिए एक अच्छा उपयोग क्या है?"

यह सूर्य की मार्गदर्शिका से है जब उन्होंने सुविधा (मूल में जोर) जारी की:

तो आपको स्थिर आयात का उपयोग कब करना चाहिए? बहुत तुच्छ! केवल इसका उपयोग करें जब आप अन्यथा को स्थिर प्रतियों की स्थानीय प्रतिलिपि घोषित करने या विरासत का दुरुपयोग करने के लिए परीक्षा (लगातार इंटरफ़ेस एंटीपटार्टन) चाहते हैं … यदि आप स्थिर आयात सुविधा का अति प्रयोग करते हैं, तो यह आपके प्रोग्राम को अपठनीय और अचूक बनाने योग्य बना सकता है, अपने नेमस्पेस को आपके द्वारा आयात किए गए सभी स्थिर सदस्यों के साथ प्रदूषित कर सकता है। आपके कोड के पाठक (आपके सहित, इसे लिखने के कुछ महीने बाद) पता नहीं होगा कि किस वर्ग के एक स्थिर सदस्य से आए हैं क्लास से सभी स्थिर सदस्यों को आयात करना विशेष रूप से पठनीयता के लिए हानिकारक हो सकता है; अगर आपको केवल एक या दो सदस्यों की आवश्यकता है, तो उन्हें व्यक्तिगत रूप से आयात करें

( http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html )

दो भागों में मैं विशेष रूप से कॉल करना चाहता हूं:

  • स्थैतिक आयात का उपयोग केवल तभी करें जब आप "उत्तराधिकार का दुरुपयोग" करने का प्रयास कर रहे थे इस मामले में, क्या आप बिजनेस extend some.package.DA को कुछ extend some.package.DA ? यदि हां, तो स्थिर आयात इस तरह से निपटने का एक क्लीनर तरीका हो सकता है। अगर आप कभी भी कुछ some.package.DA का विस्तार करने का सपना नहीं रखते थे। some.package.DA , तो यह संभवतः स्थैतिक आयात का खराब उपयोग है। टाइप करने में कुछ अक्षर बचाने के लिए इसका उपयोग न करें।
  • व्यक्तिगत सदस्यों को आयात करें DA.* बजाय import static some.package.DA.save । इससे यह पता लगाना आसान होगा कि यह आयातित विधि कहां से आ रही है।

निजी तौर पर, मैंने इस भाषा की सुविधा का प्रयोग बहुत कम ही किया है, और लगभग हमेशा ही स्थिर या ऊर्जा के साथ, विधियों के साथ कभी नहीं। व्यापार बंद, मेरे लिए, लगभग इसके लायक कभी नहीं है

स्थिर आयात के लिए एक और उचित उपयोग JUnit 4 के साथ है। JUnit विधियों के पहले संस्करणों में जैसे assertEquals और fail गए थे क्योंकि परीक्षण वर्ग ने junit.framework.TestCase विस्तार junit.framework.TestCase । टेस्ट junit.framework.TestCase

 // old way import junit.framework.TestCase; public class MyTestClass extends TestCase { public void myMethodTest() { assertEquals("foo", "bar"); } } 

4 जून में, परीक्षण कक्षाओं को अब TestCase का विस्तार करने की आवश्यकता नहीं है और इसके बजाय एनोटेशन का उपयोग कर सकते हैं। तब आप स्थैतिक रूप से org.junit.Assert से विधियों का आयात कर सकते हैं:

 // new way import static org.junit.Assert.assertEquals; public class MyTestClass { @Test public void myMethodTest() { assertEquals("foo", "bar"); // instead of Assert.assertEquals("foo", "bar"); } } 

JUnit दस्तावेजों का उपयोग इस तरह से।

प्रभावी जावा, द्वितीय संस्करण , आइटम 1 9 के अंत में नोट्स है कि आप स्थैतिक आयात का उपयोग कर सकते हैं यदि आप अपने आप को एक उपयोगिता वर्ग से स्थिरांकों का भारी उपयोग करते हैं। मुझे लगता है कि यह सिद्धांत दोनों स्थिर और विधियों के स्थैतिक आयात पर लागू होगा।

 import static com.example.UtilityClassWithFrequentlyUsedMethods.myMethod; public class MyClass { public void doSomething() { int foo= UtilityClassWithFrequentlyUsedMethods.myMethod(); // can be written less verbosely as int bar = myMethod(); } } 

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

आपको अभी भी इसका उपयोग कम से कम करना चाहिए, और तभी आप आयातित फाइल से कई बार कई चीजें इस्तेमाल कर पाते हैं।

संपादित करें: विधियों के लिए और अधिक विशिष्ट होने के लिए अपडेट किया गया, जैसा कि यह सवाल है कि यह प्रश्न क्या है क्या आयात किया जा रहा है (स्थिर या विधियां) की परवाह किए बिना सिद्धांत लागू होता है

मैं इसे बहुत रंग के लिए उपयोग करता हूँ

 static import java.awt.Color.*; 

यह बहुत संभावना नहीं है कि रंग कुछ और के साथ भ्रमित हो जाएगा

मैं मानता हूं कि वे पठनीयता के परिप्रेक्ष्य से समस्याग्रस्त हो सकते हैं और इसे कम से कम इस्तेमाल किया जाना चाहिए लेकिन एक सामान्य स्थिर विधि का उपयोग करते समय वे वास्तव में पठनीयता में वृद्धि कर सकते हैं। उदाहरण के लिए, एक JUnit परीक्षण वर्ग में, assertEquals तरह तरीकों स्पष्ट कर रहे हैं वे कहाँ से आया इसी तरह से तरीकों के लिए java.lang.Math

स्थिर आयात जावा का केवल "नया" सुविधा है जिसका उपयोग मैंने कभी नहीं किया है और कभी भी इसका इस्तेमाल करने का इरादा नहीं, क्योंकि आपने जो भी समस्याएं लिखी हैं

मुझे लगता है कि गेटटेक्स्ट-स्टाइल में एनएलएस के लिए स्थैतिक आयात साफ हैं

 import static mypackage.TranslatorUtil._; //... System.out.println(_("Hello world.")); 

यह दोनों स्ट्रिंग को एक स्ट्रिंग के रूप में चिह्नित करता है जिसे निकाला जाना है और स्ट्रिंग को इसके अनुवाद के साथ बदलने के लिए एक आसान और साफ तरीका प्रदान करता है।

आईएमओ स्थिर आयात काफी अच्छी सुविधा है यह बिल्कुल सही है कि स्थैतिक आयात पर भारी निर्भरता कोड को अपठनीय और समझने में कठिन है जो एक स्थिर विधि या विशेषता का संबंध है हालांकि, मेरे अनुभव में यह एक उपयोगी सुविधा बन जाती है, विशेषकर जब Util वर्गों को डिज़ाइन करते हैं जो कुछ स्थिर तरीके और गुण प्रदान करते हैं। स्थैतिक आयात प्रदान करते समय उत्पन्न होने वाली अस्पष्टता कोड मानकों को स्थापित करके खारिज कर सकते हैं। किसी कंपनी के भीतर मेरे अनुभव में यह दृष्टिकोण स्वीकार्य है और कोड क्लीनर और समझने में आसान बनाता है। अधिमानतः मैं सामने वाले स्टेटिक विधियों और स्थिर गुणों (किसी तरह सी से अपनाया गया) में _ वर्ण डालें। जाहिरा तौर पर यह दृष्टिकोण जावा के नामकरण मानकों का उल्लंघन करता है लेकिन यह कोड को स्पष्टता प्रदान करता है। उदाहरण के लिए, यदि हमारे पास एक एंगुलयूटील्स वर्ग है:

 public class AngleUtils { public static final float _ZERO = 0.0f; public static final float _PI = 3.14f; public static float _angleDiff(float angle1, float angle2){ } public static float _addAngle(float target, float dest){ } } 

इस मामले में स्थिर आयात स्पष्टता प्रदान करता है और कोड संरचना मेरे लिए अधिक सुंदर लगती है:

 import static AngleUtils.*; public class TestClass{ public void testAngles(){ float initialAngle = _ZERO; float angle1, angle2; _addAngle(angle1, angle2); } } 

ठीक से कोई यह बता सकता है कि कौन से विधि या विशेषता स्थिर आयात से आती है और यह उन वर्ग की जानकारी को छुपाता है जो इसे संबंधित है मैं उन वर्गों के लिए स्थैतिक आयात का उपयोग करने का सुझाव नहीं देता जो मॉड्यूल का अभिन्न हिस्सा हैं और स्थिर और गैर-स्थिर तरीके प्रदान करते हैं क्योंकि इन मामलों में यह जानना महत्वपूर्ण है कि किस श्रेणी में कुछ स्थिर कार्यक्षमता प्रदान की गई है

मैं 'स्थिर स्थिर java.lang.Math। *' का उपयोग करता हूं, जब गणित के भारी कोड को सी / सी ++ से जावा में पोर्ट किया जाता है गणित के तरीकों का नक्शा 1 से 1 है और वर्ग नाम योग्यता के बिना पोर्टेड कोड को आसान बना देता है।

आपको उन्हें उपयोग करना होगा जब:

  • आप enum मानों के साथ एक switch स्टेटमेंट का उपयोग करना चाहते हैं
  • आप अपने कोड को समझना मुश्किल बनाना चाहते हैं

मैं जावा के साथ ओपनजीएल का उपयोग करते समय स्थैतिक आयात का उपयोग करने की सलाह देता हूं, जो उपयोग- श्रेणी में "उपयोगिता वर्ग से स्थिरांक का भारी उपयोग" श्रेणी में गिरता है

उस पर विचार करे

 import static android.opengl.GLES20.*; 

आपको मूल सी कोड बंद करने की अनुमति देता है और कुछ पठनीय लिखता है जैसे कि:

 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glUniform1i(samplerUniform, 0); glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer); glVertexAttribPointer(vtxAttrib, 3, GL_FLOAT, false, 0, 0); 

उस सामान्य व्यापक कुरूपता के बजाय:

 GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); GLES20.glUniform1i(samplerUniform, 0); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vtxBuffer); GLES20.glVertexAttribPointer(vtxAttrib, 3, GLES20.GL_FLOAT, false, 0, 0); 

वे शब्दाडंबर को कम करने के लिए उपयोगी होते हैं, खासकर उन मामलों में जहां बहुत से आयातित तरीकों को बुलाया जाता है, और स्थानीय और आयातित तरीकों के बीच का अंतर स्पष्ट है।

एक उदाहरण: कोड है जिसमें java.lang.Math के कई संदर्भ शामिल हैं I

एक और: एक एक्सएमएल बिल्डर वर्ग जहां हर संदर्भ में क्लासनाम को तैयार किया जा रहा है, संरचना का निर्माण किया जा रहा है छिपाना होगा

मैं उनको तब उपयोग करता हूं जब कभी मैं कर सकता हूं। अगर मुझे भूल जाए तो मुझे याद दिलाने के लिए मेरे पास IntelliJ सेटअप है मुझे लगता है कि यह पूरी तरह से योग्य पैकेज नाम की तुलना में बहुत साफ दिखता है।