दिलचस्प पोस्ट
MFMailComposeViewController के MailComposer शीट में एक UIImage कैसे जोड़ें एंड्रॉइड 4.2 में एपीएन पढ़ें? COUNT (*) बनाम COUNT (1) बनाम COUNT (पीके): जो बेहतर है? प्रक्रिया संभालती कैसे गणना करना है? कार्य निष्पादित करने के लिए विफल 'एप: मर्ज डीबग संसाधनों' Crunching Cruncher … png विफल "Char s " जैसे फ़ंक्शन के सरणी पैरामीटर में स्थिर कीवर्ड का उद्देश्य क्या है? डीबग करें और विजुअलाइज स्टूडियो कोड के साथ Angular2 टाइपस्क्रिप्ट करें? सीतनिद्रा में होना, @ स्यूजेन्स जनरेटर और आवंटन आकार क्या सादे पाठ लौटने के लिए एएसपी.नेट वेब एपीआई को बल देने का एक तरीका है? अजगर के साथ Win32 API का उपयोग कैसे करें? कैश किए गए सीएसएस डेटा की ताज़ा करें NSString का आकार कैसे प्राप्त करें मार्शल सी ++ स्ट्रेट सरणी सी # में Json मेरे angular.js एनजी मॉडल में लोड करने के लिए कैसे? कस्टम सूची दृश्य एंड्रॉइड

क्यों java.util.Observable एक सार वर्ग नहीं है?

मैंने अभी देखा है कि जावा। ऊतक। ओब्स्सेवेबल एक ठोस वर्ग है। चूंकि पर्यवेक्षण का उद्देश्य विस्तारित होना है, इसलिए यह मेरे लिए अजीब लगता है। क्या इस कारण से इस तरह लागू किया गया था?

मुझे यह लेख मिला जो कहता है

देखे जाने योग्य एक कंक्रीट वर्ग है, इसलिए इसे प्राप्त होने वाला वर्ग पहले ही निर्धारित किया जाना चाहिए, क्योंकि जावा में केवल एक विरासत की अनुमति है

लेकिन यह वास्तव में मुझे समझा नहीं देता वास्तव में, यदि अवलोकन योग्य सार था, तो उपयोगकर्ता इसे से लेकर वर्ग को निर्धारित करने के लिए मजबूर हो जाएगा

वेब के समाधान से एकत्रित समाधान "क्यों java.util.Observable एक सार वर्ग नहीं है?"

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

लेकिन अगर हम अवलोकन के स्रोत कोड को देखते हैं, तो हम देखते हैं कि एक आंतरिक ध्वज है

 private boolean changed = false; 

यह हर बार अधिसूचना ओब्सर्सर्स को लाया जाता है:

 public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } 

लेकिन इस अवलोकन के द्वारा बनाए गए एक वर्ग से, हम इस ध्वज को बदल नहीं सकते , क्योंकि यह निजी है, और इसे बदलने के लिए दिए गए तरीके संरक्षित हैं।

इसका मतलब यह है कि उपयोगकर्ता अवलोकन वर्ग को उप-वर्ग के लिए मजबूर कर दिया गया है, और मैं कहूंगा कि "सार" कीवर्ड की कमी सिर्फ एक "गलती" है

मैं कहूंगा कि यह वर्ग एक पूर्ण स्क्रूप है

काफी आसानी से यह एक गलती है कि निष्कासन एक वर्ग है , बिल्कुल सार या अन्यथा।

Observable एक इंटरफ़ेस होना चाहिए था और जेडीके को एक सुविधाजनक कार्यान्वयन प्रदान करना चाहिए था (जैसे List एक इंटरफ़ेस है और ArrayList एक कार्यान्वयन है)

जावा में काफी कुछ "गलतियां" हैं, जिनमें शामिल हैं:

  • java.util.Stack एक वर्ग है, एक अंतरफलक नहीं (जैसे अवलोकन, बुरा विकल्प)
  • java.util.Properties java.util.Hashtable विस्तारित करता है (एक का उपयोग करने के बजाय)
  • Java.util.Date वर्ग एक गड़बड़ का एक सा है, और अपरिवर्तनीय नहीं है !
  • Java.util.Calendar वर्ग एक असली गड़बड़ है
  • कोई अहस्ताक्षरित 'बाइट' प्रकार (यह एक वास्तविक दर्द और कई निम्न-स्तर की बगों का स्रोत है)
  • java.sql.SQLException एक जाँच अपवाद है
  • Arrays Arrays.toString(array) उपयोग उनके डिफ़ॉल्ट toString() रूप में नहीं करते हैं (यह कितने प्रश्न हैं?)
  • Cloneable योग्य एक मार्कर इंटरफ़ेस नहीं होना चाहिए; इसमें clone() होना चाहिए clone() विधि और Object.clone() मौजूद नहीं होना चाहिए

जबकि सोपबॉक्स पर , भाषा के संदर्भ में, आईएमएचओ:

  • == .equals() विधि को निष्पादित करना चाहिए (यह सिरदर्द का भार पैदा करता है)
  • पहचान तुलना == या तो होनी चाहिए === जावास्क्रिप्ट या एक समर्पित विधि जैसे boolean isIdentical(Object o) , क्योंकि आपको इसे कभी भी ज़रूरत नहीं है!
  • < Comparable ऑब्जेक्ट के लिए (और इसी तरह के > <= , <= , >= ) के लिए compareTo(Object o) < 0 को निष्पादित करना चाहिए