जावा और सी # में एक स्थिर मुख्य विधि क्यों, एक निर्माता की बजाय?


54

मैं क्यों (विशेष रूप से) के लिए एक प्राथमिक या द्वितीयक स्रोत से एक निश्चित उत्तर की तलाश कर रहा हूं, जावा और सी # ने अपने प्रवेश बिंदु के रूप में एक स्थिर विधि का फैसला किया है, बजाय एक Applicationवर्ग के उदाहरण के एक आवेदन उदाहरण का प्रतिनिधित्व करने के बजाय (प्रवेश बिंदु के साथ) एक उपयुक्त निर्माता होने के नाते)।


पृष्ठभूमि और मेरे पूर्व अनुसंधान का विवरण

यह पहले पूछा गया है। दुर्भाग्य से, मौजूदा जवाब केवल सवाल का भीख माँग रहे हैं । विशेष रूप से, निम्नलिखित उत्तर मुझे संतुष्ट नहीं करते हैं, क्योंकि मैं उन्हें गलत मानता हूं:

  • यदि कंस्ट्रक्टर ओवरलोड था, तो अस्पष्टता होगी। - वास्तव में, C # (साथ ही C और C ++) अलग-अलग हस्ताक्षरों की अनुमति देता है Mainताकि एक ही संभावित अस्पष्टता मौजूद रहे, और इससे निपटा जा सके।
  • एक staticविधि का अर्थ है कि आरंभिक क्रम के स्पष्ट होने से पहले किसी भी वस्तु को त्वरित नहीं किया जा सकता है। - यह सिर्फ तथ्यात्मक रूप से गलत है, कुछ वस्तुओं को पहले (जैसे स्थैतिक निर्माणकर्ता) में तत्काल किया जाता है।
  • तो उन्हें मूल वस्तु को तत्काल करने के लिए बिना रनटाइम द्वारा ही बुलाया जा सकता है। - इसका कोई जवाब नहीं है।

बस आगे यह बताने के लिए कि मुझे क्यों लगता है कि यह एक वैध और दिलचस्प सवाल है:

  • कई व्यवस्थाएं कर कक्षाओं का उपयोग प्रवेश बिंदुओं के रूप में आवेदन, और कंस्ट्रक्टर प्रतिनिधित्व करने के लिए। उदाहरण के लिए, VB.NET एप्लिकेशन फ्रेमवर्क प्रविष्टि बिंदु 1 के रूप में एक समर्पित मुख्य संवाद (और इसके निर्माता) का उपयोग करता है ।

  • न तो जावा और न ही सी # तकनीकी रूप से एक मुख्य विधि की आवश्यकता है। ठीक है, संकलन करने के लिए C # की आवश्यकता है, लेकिन जावा भी ऐसा नहीं है। और न ही मामले में निष्पादन की आवश्यकता है। तो यह एक तकनीकी प्रतिबंध नहीं प्रतीत होता है। और, जैसा कि मैंने पहले पैराग्राफ में उल्लेख किया है, एक मात्र सम्मेलन के लिए यह जावा और सी # के सामान्य डिजाइन सिद्धांत के साथ अजीब तरह से अनफिट लगता है।

स्पष्ट है, वहाँ एक विशिष्ट नहीं है नुकसान एक स्थिर होने के लिए mainविधि है, यह सिर्फ साफ़ है अजीब है, जो बनाया मुझे आश्चर्य है कि अगर इसके पीछे कुछ तकनीकी औचित्य था।

मैं एक प्राथमिक या माध्यमिक स्रोत से एक निश्चित जवाब में दिलचस्पी लेता हूं, न कि केवल कल्पनाओं में।


1 हालांकि एक कॉलबैक ( Startup) है जो इसे रोक सकता है।


4
@mjfgates इसके अलावा, मैं यह स्पष्ट कर दिया है कि यह बना दिया है करने के लिए आशा व्यक्त की थी नहीं बस "क्यों लोग जिस तरह से मैं चाहता भी नहीं किया", और है कि मैं वास्तव में कारणों में दिलचस्पी रखता हूँ।
कोनराड रूडोल्फ

2
जावा के लिए मुझे लगता है कि तर्क सरल है: जावा विकसित करते समय, वे जानते थे कि भाषा सीखने वाले अधिकांश लोग C / C ++ को पहले से जानते होंगे। इसलिए जावा न केवल कहने के लिए सी के बजाय सी / सी ++ की तरह दिखता है, बल्कि सी / सी ++ (सिर्फ अष्ट पूर्णांक शाब्दिक के बारे में सोचो) से idiosynchrasies पर ले लिया। चूंकि c / c ++ दोनों एक मुख्य विधि का उपयोग करते हैं, जावा के लिए उसी दृष्टिकोण से किया गया।
वूड

5
@ जारारोड आप अनुचित हैं। मुझे लगा कि मैंने इसे स्पष्ट रूप से एक शेख़ी में नहीं बनाया है । "रचनात्मक नहीं"? ऐसा कैसे? मैं स्पष्ट रूप से संदर्भों के लिए कह रहा हूं, न कि केवल जंगली चर्चाएं। आप निश्चित रूप से असहमत हैं कि यह एक दिलचस्प सवाल है। लेकिन अगर इस तरह के प्रश्न यहां ओटी हैं, तो मैं वास्तव में यह देखने में विफल हूं कि प्रोग्रामर किस उद्देश्य से काम करता है।
कोनराड रुडोल्फ

2
प्रासंगिक मेटा चर्चा
यानिस

3
प्रश्न: यदि यह एक एप्लिकेशन ऑब्जेक्ट है, तो आपको दो चीजों की आवश्यकता नहीं है। 1) एक निर्माता। 2) अपने आवेदन को चलाने के लिए वस्तु पर एक विधि। कंस्ट्रक्टर को ऑब्जेक्ट वैध होने के लिए पूरा करना होगा और इस प्रकार रन-सक्षम होना चाहिए।
मार्टिन

जवाबों:


38

टी एल; डॉ

जावा में, इसका कारण public static void main(String[] args)यह है

  1. गोसलिंग चाहते थे
  2. C में अनुभव किए गए किसी व्यक्ति द्वारा लिखा गया कोड (जावा में नहीं)
  3. किसी के द्वारा क्रियान्वित किया जाना NeWS पर पोस्टस्क्रिप्ट चलाने के लिए उपयोग किया जाता है

http://i.stack.imgur.com/qcmzP.png

 
C # के लिए, रीज़निंग समान रूप से बोलने के लिए समान है। भाषा डिजाइनरों ने जावा से आने वाले प्रोग्रामरों के लिए प्रोग्राम एंट्री पॉइंट सिंटैक्स को परिचित रखा । जैसा कि C # आर्किटेक्ट एंडर्स हेजलसबर्ग इसे कहते हैं ,

... C # के साथ हमारा दृष्टिकोण बस एक वैकल्पिक ... जावा प्रोग्रामर की पेशकश करने का रहा है ...

 

दीर्घ संस्करण

ऊपर का विस्तार और उबाऊ संदर्भ के साथ समर्थित है।

 

जावा टर्मिनेटर हस्ता ला विस्टा बेबी!

वीएम स्पेस, 2.17.1 वर्चुअल मशीन स्टार्ट-अप

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

java Terminator Hasta la vista Baby!

कक्षा के मुख्य विधि Terminator(अनाम पैकेज में एक वर्ग) को लागू करके और इसे चार स्ट्रिंग्स "हस्ता", "ला", "विस्टा" और "बेबी!" से जोड़कर एक जावा वर्चुअल मशीन शुरू करेगा ।

... यह भी देखें: परिशिष्ट: मुझे आपके कपड़े, आपके जूते और आपकी मोटरसाइकिल चाहिए

  • मेरी व्याख्या:
    कमांड लाइन इंटरफ़ेस में विशिष्ट स्क्रिप्ट की तरह उपयोग के लिए लक्षित निष्पादन।

 

महत्वपूर्ण कदम

... जो हमारी जाँच में झूठे निशान से बचने में मदद करता है।

वीएम स्पेस, 1.2 जावा वर्चुअल मशीन

जावा वर्चुअल मशीन जावा प्रोग्रामिंग भाषा के कुछ भी नहीं जानती है ...

पूर्व अध्याय का अध्ययन करते समय मैंने ऊपर देखा - 1.1 इतिहास जो मुझे लगा कि सहायक हो सकता है (लेकिन बेकार हो गया)।

  • मेरी व्याख्या:
    निष्पादन केवल वीएम युक्ति द्वारा शासित होता है, जो
    स्पष्ट रूप से घोषित करता है कि इसका जावा भाषा से कोई लेना-देना नहीं है
    => JLS और कुछ भी जावा भाषा से संबंधित सभी को अनदेखा करने के लिए ठीक है

 

गोसलिंग: C और स्क्रिप्टिंग भाषा के बीच एक समझौता ...

ऊपर के आधार पर, मैंने JVM इतिहास के लिए वेब खोजना शुरू किया । परिणामों में बहुत अधिक कचरा, मदद नहीं की।

फिर, मैंने गोस्लिंग के बारे में किंवदंतियों को याद किया और गोस्लिंग JVM के इतिहास में अपनी खोज को सीमित कर दिया ।

यूरेका! जेवीएम स्पेक कैसे बने

जेवीएम लैंग्वेज समिट 2008 के इस मुख्य अंश में, जेम्स गोसलिंग ने चर्चा की ... जावा का निर्माण, ... सी और स्क्रिप्टिंग भाषा के बीच एक समझौता ...

  • मेरी व्याख्या:
    स्पष्ट घोषणा कि निर्माण के समय,
    सी और स्क्रिप्टिंग को सबसे महत्वपूर्ण प्रभाव माना गया है।
     
    पहले से ही वीएम युक्ति 2.17.1 में पटकथा को मंजूरी देखा,
    आदेश पंक्ति तर्क पर्याप्त समझाने String[] args
    लेकिन staticऔर mainआगे खुदाई करने के लिए की जरूरत है अभी तक वहाँ नहीं कर रहे हैं, ...

इसे टाइप करते समय ध्यान दें - C, स्क्रिप्टिंग और VM Spec 1.2 को इसके कुछ भी नहीं - जावा से जोड़ते हुए - मुझे ऐसा लगता है कि कुछ परिचित, कुछ ... ऑब्जेक्ट ओरिएंटेड धीरे-धीरे गुजर रहा है। मेरा हाथ थाम लो और मूव रख लो 'अब हम लगभग वहाँ हैं

मुख्य स्लाइड ऑनलाइन उपलब्ध हैं: 20_Gosling_keynote.pdf , मुख्य बिंदुओं की प्रतिलिपि बनाने के लिए काफी सुविधाजनक।

    पेज 3

        जावा का प्रागितिहास
        * मेरी सोच को क्या आकार दिया

    पेज 9

        समाचार
        * नेटवर्क एक्स्टेंसिबल विंडो सिस्टम
        * स्क्रिप्टिंग पर आधारित एक विंडो सिस्टम ...।
          परिशिष्ट भाग (!!)

    पेज 16

        एक बड़ा (लेकिन शांत) लक्ष्य:
          मैं कितना करीब आ सकता था
          "स्क्रिप्टिंग" महसूस ...

    पेज 19

        मूल अवधारणा
        * इमारत के बारे में सब था
          चीजों के नेटवर्क,
          एक पटकथा द्वारा आर्केस्ट्रा
          भाषा: हिन्दी
        * (यूनिक्स गोले, AppleScript, ...)

    पेज 20

        भेड़ियों के कपड़ों में एक भेड़िया
        * डेवलपर्स बनाने के लिए सी सिंटैक्स
          आरामदायक

ए-हा! आइए C सिंटैक्स पर करीब से देखें ।

"हैलो, दुनिया" उदाहरण ...

main()
{
    printf("hello, world\n");
}

... मुख्य नाम के एक फ़ंक्शन को परिभाषित किया जा रहा है। मुख्य समारोह सी कार्यक्रमों में एक विशेष उद्देश्य कार्य करता है; रन-टाइम वातावरण प्रोग्राम निष्पादन शुरू करने के लिए मुख्य फ़ंक्शन को कॉल करता है।

... मुख्य फ़ंक्शन में वास्तव में दो तर्क हैं, int argcऔर char *argv[]क्रमशः, जो कमांड लाइन तर्क को संभालने के लिए उपयोग किया जा सकता है ...

क्या हम करीब आ रहे हैं? बिलकुल। यह भी उपरोक्त उद्धरण से "मुख्य" लिंक का अनुसरण करने लायक है:

मुख्य कार्य वह है जहां एक कार्यक्रम निष्पादन शुरू होता है। यह प्रोग्राम की कार्यक्षमता के उच्च-स्तरीय संगठन के लिए ज़िम्मेदार है, और आम तौर पर इसे निष्पादित किए जाने पर प्रोग्राम को दिए गए कमांड तर्कों तक पहुंच होती है।

  • मेरी व्याख्या:
    सी डेवलपर के लिए सहज होने के लिए, कार्यक्रम प्रविष्टि बिंदु होना चाहिए main
    इसके अलावा, चूंकि जावा को कक्षा में होने के लिए किसी भी विधि की आवश्यकता होती है, Class.mainयह
    उतना ही करीब है जितना कि यह हो जाता है: स्थिर मंगलाचरण, बस वर्ग नाम और डॉट,
    कोई भी निर्माता कृपया नहीं - सी ऐसा कुछ नहीं जानता है।
     
    यह भी संक्रामक सी # पर लागू होता है, को ध्यान में रखते
    जावा से यह करने के लिए आसान प्रवास के विचार।

पाठकों को लगता है कि परिचित प्रोग्राम एंट्री पॉइंट से कोई फर्क नहीं पड़ता है, कृपया स्टैक ओवरफ्लो प्रश्नों को खोजने और जांचने के लिए आमंत्रित किया जाता है, जहां जावा एसई से आने वाले लोग जावा एमई एमआईडीपी के लिए हैलो वर्ल्ड लिखने की कोशिश कर रहे हैं । नोट MIDP प्रविष्टि बिंदु के पास न तो है mainऔर न ही static

 

निष्कर्ष

उपरोक्त के आधार पर मैं कहूंगा कि static, mainऔर String[] argsजावा और C # के क्षणों में कार्यक्रम प्रविष्टि बिंदु को परिभाषित करने के लिए सबसे उचित विकल्प थे ।

 

परिशिष्ट: मुझे आपके कपड़े, आपके जूते और आपकी मोटरसाइकिल चाहिए

स्वीकार करना है, VM Spec 2.17.1 पढ़ना बहुत मजेदार था।

... कमांड लाइन

java Terminator Hasta la vista Baby!

कक्षा के मुख्य विधि Terminator(अनाम पैकेज में एक वर्ग) को लागू करके और इसे चार स्ट्रिंग्स "हस्ता", "ला", "विस्टा" और "बेबी!" से जोड़कर एक जावा वर्चुअल मशीन शुरू करेगा ।

अब हम उन चरणों की रूपरेखा तैयार करते हैं, जिन्हें वर्चुअल मशीन Terminatorलोडिंग, लिंकिंग और इनिशियलाइज़ेशन प्रक्रियाओं के उदाहरण के रूप में निष्पादित कर सकती है , जिन्हें बाद के खंडों में आगे वर्णित किया गया है।

प्रारंभिक प्रयास ... पता चलता है कि वर्ग Terminatorलोड नहीं है ...

Terminatorलोड होने के बाद , इसे मुख्य किए जाने से पहले आरंभीकृत किया जाना चाहिए, और एक प्रकार (वर्ग या इंटरफ़ेस) को प्रारंभिक होने से पहले हमेशा लिंक किया जाना चाहिए। लिंकिंग (preparation2.17.3) में सत्यापन, तैयारी और (वैकल्पिक रूप से) रिज़ॉल्यूशन शामिल है ...

सत्यापन (loaded2.17.3) यह जाँचता है कि भरी हुई प्रतिनिधित्व Terminatorअच्छी तरह से बनाई गई है ...

संकल्प (checking2.17.3) वर्ग से प्रतीकात्मक संदर्भों की जाँच की प्रक्रिया है Terminator...

 
Terminatorओह, हाँ से प्रतीकात्मक संदर्भ ।


2
किसी कारण से मुझे यह विश्वास करना मुश्किल था कि "आधुनिकता" एक वास्तविक शब्द था।
someguy

@ उत्तर की सोंगो कहानी भी एक फिल्म की तरह है। यह पहली बार मेटा में पोस्ट किया गया है , प्रश्न बंद होने की चर्चा में: "यदि प्रश्न फिर से खोला जाएगा, तो मैं शायद नीचे एक उत्तर लिखूंगा ..." फिर इसे फिर से खोलने के लिए अपील करने के लिए इस्तेमाल किया गया था और अंत में यहां स्थानांतरित किया गया था।
कुटकी

16

यह सिर्फ मुझे अपमानजनक लगता है। एक कंस्ट्रक्टर का उपयोग किसी ऑब्जेक्ट के इनिशियलाइज़ेशन के लिए किया जाता है: यह एक ऑब्जेक्ट सेट करता है, जो बाद में इसे बनाने वाले कोड द्वारा उपयोग किया जाता है।

यदि आप निर्माणकर्ता के अंदर बुनियादी उपयोग की कार्यक्षमता डालते हैं, और फिर वास्तव में उस वस्तु का उपयोग नहीं करते हैं जो निर्माणकर्ता बाहरी कोड में बनाता है, तो आप ओओपी के सिद्धांतों का उल्लंघन कर रहे हैं। असल में, कोई स्पष्ट कारण के लिए वास्तव में अजीब कुछ कर रहा है।

आप ऐसा क्यों करना चाहेंगे?


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

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

9

जावा के लिए मुझे लगता है कि तर्क सरल है: जावा विकसित करते समय, देवता जानते थे कि भाषा सीखने वाले अधिकांश लोग पहले से ही C / C ++ जानते होंगे।

इसलिए जावा न केवल कहने के लिए सी / सी ++ की तरह बहुत कुछ दिखता है, बल्कि सी / सी ++ (सिर्फ अष्ट पूर्णांक शाब्दिक के बारे में सोचो) से idiosynchrasies पर ले लिया। चूंकि c / c ++ दोनों एक मुख्य विधि का उपयोग करते हैं, जावा के लिए उसी दृष्टिकोण से किया गया।

मुझे पूरा यकीन है कि मुझे बलोच याद है या कोई इस रेखा के साथ कुछ कह रहा है कि उन्होंने ऑक्टल पूर्णांक शाब्दिक क्यों जोड़ा है, मैं देखूंगा कि क्या मुझे अन्य स्रोत मिल सकते हैं :)


2
यदि C ++ के समान ही जावा के लिए बहुत महत्वपूर्ण था, तो वे उदाहरण के लिए क्यों बदल :गए extends? और public static void main(String [ ] args)एक वर्ग के अंदर एक वर्ग के int main(int argc, char **argv)बाहर की तुलना में काफी अलग है ।
svick

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

जावा में शून्य में c में @svick int के साथ था कि कैसे एक एप्लिकेशन से एक रिटर्न कोड उत्पन्न होता है - जावा में, इसका 0 जब तक कि System.exit (int) लागू नहीं होता है। मापदंडों का परिवर्तन प्रत्येक भाषा में तार के सरणियों को कैसे पारित किया जाता है, इसके साथ करना है। जावा में सब कुछ एक वर्ग में है - यह कहीं और होने का कोई विकल्प नहीं है। बदलने के :लिए extendsएक वाक्य रचना की बात है और अनिवार्य रूप से एक ही हैं। बाकी सब भाषा से तय होते हैं।

@ मिचेल्ट लेकिन वे सभी डिज़ाइन निर्णय हैं जो जावा को C ++ से अलग बनाते हैं। तो जावा को C ++ के समान ही क्यों रखा जाएगा main(), जब यह स्पष्ट रूप से अन्य मामलों में पर्याप्त महत्वपूर्ण नहीं था।
२१:३२ पर svick

सिवाय इसके कि सी में मुख्य से भी कुछ भी वापस नहीं करना पूरी तरह से ठीक है और ऐसी तुच्छताएं शायद ही किसी को भ्रमित करें। बिंदु सी + + और उसकी सभी गलतियों को फिर से बनाने के लिए नहीं था, लेकिन केवल प्रोग्रामर को घर पर अधिक बनाने के लिए। आपको क्या लगता है कि C ++ प्रोग्रामर के पास पढ़ने का आसान समय होगा: जावा या ऑब्जेक्टिव-सी कोड? आपको क्या लगता है कि C ++ प्रोग्रामर एक मुख्य विधि या प्रवेश बिंदु के रूप में कुछ वर्ग के निर्माता के लिए अधिक स्पष्ट दिखाई देगा?
वू

6

खैर, वहाँ बहुत सारे मुख्य कार्य हैं जो सिर्फ एक अनंत लूप चलाते हैं। एक निर्माणकर्ता इस तरह से काम करता है (एक ऐसी वस्तु के साथ जो कभी नहीं बनती है) जो मुझे अजीब लगती है।

इस अवधारणा के बारे में बहुत सारी मजेदार बातें हैं। आपका तर्क एक अजन्मी वस्तु के ऊपर चल रहा है, ऐसी वस्तुएँ जो मरने के लिए पैदा हुई हैं (क्योंकि वे कंस्ट्रक्टर में अपना सारा काम करती हैं), ...

क्या ये सभी दुष्प्रभाव ओओ वैगन को एक साधारण जनता की तुलना में अधिक भ्रष्ट नहीं करेंगे (क्योंकि इसे किसी अज्ञात द्वारा एक्सेस करने की आवश्यकता है) स्थैतिक (क्योंकि हमें शुरू करने के लिए कोई उदाहरण की आवश्यकता नहीं है) शून्य मुख्य (क्योंकि यह प्रवेश बिंदु है )?

जावा में मौजूद एक साधारण, सादे, फंक्शन एंट्री पॉइंट के लिए, सार्वजनिक और स्थिर रूप से आवश्यक होगा। हालांकि एक स्थिर विधि होने के नाते , यह जो हम चाहते हैं उसे पूरा करने के लिए एक सादे समारोह के पास और अधिक प्राप्त कर सकते हैं।

यदि आप एक सरल, सादा, फ़ंक्शन प्रविष्टि बिंदु को प्रविष्टि बिंदु के रूप में अपनाने नहीं जा रहे हैं। आगे ऐसा क्या है जो किसी ऐसे अवरोधक के रूप में अजीब नहीं है जो निर्माण के लिए नहीं है?


1
मैं कहूंगा कि समस्या प्रथम श्रेणी के कार्यों में नहीं थी। किसी वस्तु के अंदर मुख्य () को चिपकाना (जो कि मुख्य कहे जाने से पहले त्वरित नहीं है) थोड़ा सा प्रतिरूप है। हो सकता है कि उनके पास एक "एप्लिकेशन" ऑब्जेक्ट होना चाहिए जो निर्माण करता है और इसकी गैर-स्थैतिक मुख्य () विधि चलाता है, तो आप कंस्ट्रक्टर में स्टार्टअप आरंभीकरण डाल सकते हैं, और यह स्थैतिक तरीकों की तुलना में बहुत बेहतर महसूस करेगा, हालांकि एक साधारण शीर्ष- = स्तर मुख्य () fn भी अच्छा होगा। स्थैतिक मुख्य सभी में एक कीचड़ का एक सा है।
gbjbaanb

3

आप main()जिस कक्षा में परीक्षण करने का प्रयास कर रहे हैं, उस कक्षा में चिपके रहकर, विकास के दौरान, आप क्लास में कुछ स्टैंडअलोन टेस्ट जल्दी से चला सकते हैं।


1
यह मेरे लिए संभवतः सबसे सम्मोहक कारण है, क्योंकि यह विभिन्न विन्यासों आदि के परीक्षण के लिए विकास के दौरान कई प्रवेश बिंदुओं की भी अनुमति देता है
cgull

0

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

मूल रूप से KISS का एक आवेदन पत्र।

[और, ज़ाहिर है, मुख्य कारण है: क्यों नहीं?


3
जैसा कि मैंने कहा, मैं इससे बिल्कुल भी सहमत नहीं हूं। वस्तुओं है पहले instantiated हो, और कोड से पहले मार डाला जाता है। मुझे यह समझाने के लिए मूल डेवलपर्स में से एक को उद्धरण की आवश्यकता होगी।
कोनराड रूडोल्फ

2
सी कोड से एक वर्ग को तत्काल करने के लिए आवश्यक कार्य की मात्रा एक स्थिर विधि को कॉल करने के समान है .. आपको भी समान चेक करना होगा (क्या कक्षा मौजूद है? ठीक है, क्या यह सही हस्ताक्षर के साथ एक सार्वजनिक निर्माता है? ठीक है तो आगे बढ़ो)।
वू जूल

कोई उपयोगकर्ता ऑब्जेक्ट बनाने की आवश्यकता नहीं है । ऑब्जेक्ट कंस्ट्रक्टर निष्पादित नहीं किया गया है। एपीआई स्पष्ट रूप से सरल है। और इसे समझना सबसे आसान है।
डैनियल आर हिक्स

0

मेरी समझ में प्राथमिक कारण सरल है। सन एक यूनिक्स कंपनी थी, जो यूनिक्स मशीन बेच रही थी और यूनिक्स वह है जो बाइनरी इनवॉइस के लिए C "मुख्य (args)" सम्मेलन के लिए बनाया गया था।

इसके अतिरिक्त जावा को स्पष्ट रूप से सी और सी ++ प्रोग्रामर के लिए लेने के लिए डिज़ाइन किया गया था, इसलिए केवल सी कन्वेंशन नहीं लेने का कोई अच्छा कारण नहीं था।

चुने हुए दृष्टिकोण जहां हर वर्ग में एक आह्वान विधि हो सकती है, विशेष रूप से लचीले Main-Classजार में MANIFEST.MF फ़ाइल में लाइन के साथ संयोजन में काफी लचीला है ।


बेशक, जार फ़ाइल का आविष्कार बहुत बाद में नहीं किया गया था।
डैनियल आर हिक्स

-1

यह ओओपी दर्शन के अनुरूप नहीं है कि एक कार्यक्रम ओएस प्रक्रिया के दृष्टिकोण से एक वस्तु होगा, क्योंकि परिभाषा के अनुसार एक से अधिक होने का कोई तरीका नहीं है।

उसके शीर्ष पर, कोई भी निर्माता किसी भी तरह से प्रवेश बिंदु नहीं है।

यह मुझे एक स्थिर कार्य के रूप में मुख्य करने के लिए सबसे उचित विकल्प की तरह लगता है, जो वास्तव में दिन के अंत में है। वीएम की वास्तुकला जैसे जेवीएम और सीएलआर को देखते हुए, कोई भी अन्य विकल्प अनावश्यक रूप से इसे आगे बढ़ाएगा।


1
मुझे लगता है कि आप वहां गलत हैं। यह है एक से अधिक प्रक्रिया है, इसलिए एक से अधिक वस्तु को शामिल करना संभव। संयोग से, यह पूरी तरह से Runnableएकाधिक थ्रेड के लिए ऑब्जेक्ट्स को तत्काल करने के बराबर है ।
कोनराड रुडोल्फ

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

1
जैसा कि मैंने कुछ जवाब के नीचे कहा, यह प्रासंगिक नहीं है। क्या प्रासंगिक तार्किक तार्किकता है। तार्किक रूप से, प्रक्रियाओं को लांचर (ओएस, जेवीएम, जो कुछ भी) द्वारा ऑब्जेक्ट के रूप में दर्शाया जाता है और आरंभिक होता है।
कोनराड रूडोल्फ

@KonradRudolph सच है, लेकिन किसी प्रोग्राम का आरंभीकरण किसी प्रक्रिया के आरंभीकरण का केवल एक हिस्सा है, और एक प्रोग्राम कंस्ट्रक्टर को वैध नहीं करता है।
यम मारकोविच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.