2011-06-07 8 views
10

में java.util.Date उपयोग करने के लिए क्या कोई विशेष कारण एक तिथि वर्ग (उदाहरण के लिए, एक कर्मचारी जन्म तिथि क्षेत्र में) एक API में उपयोग करने के लिए नहीं बल्कि एक लंबे या लांग कि कर रहे हैं।अच्छा कारण एक API

इसमें कुछ चर्चा है: java-date-vs-calendar, लेकिन मैं विशेष रूप से जानना चाहूंगा कि तिथियों का उपयोग करने के लिए कोई औचित्य है, जब एक लंबा (या लंबा) इतना आसान लगता है।

बेशक मैं समय-समय पर और जीडीआई में प्रदर्शन प्रदर्शित करने के लिए टाइमज़ोन और सिंपलडेट फॉरमेटर का उपयोग करता हूं, और शायद मैनिप्लेशंस करने के लिए कैलेंडर, लेकिन मैं केवल इस प्रश्न में डेटा मॉडल/एपीआई में स्टोरेज और प्रस्तुति के बारे में चिंतित हूं।

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

उत्तर

1

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

जवाब क्या आप क्या हासिल करने की आवश्यकता है पर निर्भर करेगा। यदि आपको बस तिथि से सॉर्ट करने की आवश्यकता है, तो long पर्याप्त से अधिक होगा। Date मान इसमें कुछ पठनीयता जोड़ देगा, लेकिन अधिक कार्यक्षमता नहीं। Date का उपयोग करना हानिकारक नहीं होगा, इसलिए पठनीयता कारक पर विचार किया जाना चाहिए।

तो क्षेत्र निजी होगा, आप वास्तव में यह एक लंबे समय के रूप में स्टोर और एक गेटर और एक सेटर का उपयोग Date हो सकता है:

private long mDOB; 

public Date getDOB() { return new Date(mDOB);} 
public void setDOB (Date dob) { mDOB = dob.getTime(); } 
+0

अब आप कोड को कैसे बदलेंगे कि दिनांक निर्माता (और अधिक) बहिष्कृत हैं? –

+0

@DrorCohen आप गलत हैं। वह [java.util.Date constructor] (http://docs.oracle.com/javase/8/docs/api/java/util/Date.html#Date-long-) को जावा 8 के रूप में बहिष्कृत नहीं किया गया है। इस जवाब में दिखाया गया कोड सही है। –

5

यदि आप अपने एपीआई में किसी दिनांक का प्रतिनिधित्व करने के लिए एक पूर्णांक का उपयोग करते हैं तो आप जटिलता की एक अतिरिक्त, अनावश्यक परत जोड़ देंगे जिसमें अतिरिक्त दस्तावेज़ीकरण की आवश्यकता होगी और आपके एपीआई को उपयोग करने में कठिनाई होगी।

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

3

व्यक्तिगत रूप से, के रूप में बुरा जावा में दिनांक और समय एपीआई के रूप में, मैं Date इस्तेमाल करते हैं। यह सिर्फ अधिक अर्थपूर्ण मूल्य है। इसके अतिरिक्त, आपको यह अनुमान लगाने की ज़रूरत नहीं है कि यह सेकंड या मिलीसेकंड है या नहीं।

3

एक तारीख नहीं है एक नंबर है, यह एक बिंदु समय में है । तथ्य यह है कि आप एक संख्या के साथ प्रतिनिधित्व कर सकते हैं एक कार्यान्वयन विस्तार है जो छुपाया जाना चाहिए।

0

एक लंबे आंतरिक कार्यान्वयन जानकारी है कि बदल सकता है उजागर करता है। कुछ उपयोगिताओं और पुस्तकालयों को मिलीसेकंड के बजाय सेकंड, माइक्रोसॉन्ड, या नैनोसेकंड द्वारा दिनांक-समय पर ट्रैक किया जाता है।

युग तक की संख्या से तिथि-समय मूल्यों के साथ कार्य करना के रूप में वे मानव पठनीय नहीं हैं स्वाभाविक भ्रामक है।

तो डीबगिंग और परीक्षण जटिल हैं। इसके सबूत के लिए Peruse StackOverflow।

टेक्स्ट को ऑक्टेट्स या यहां तक ​​कि बिट्स की श्रृंखला के रूप में ट्रैक क्यों न करें? क्योंकि हम पुस्तकालयों को हमारे लिए नट-किरकिरा जटिलताओं और कामों (यूटीएफ -8, मैकरोमन, खोज, प्रतिस्थापन, ट्रिमिंग इत्यादि) को संभालने के लिए चाहते हैं। इसी प्रकार, दिनांक-समय मानों को डेट-टाइम डेटा प्रकारों के रूप में संभाला जाना चाहिए।

उस ने कहा, java.util.Date और .Calendar कक्षाएं भयानक हैं। जब भी संभव हो उन्हें से बचें।

  • अब जावा 8 में हमारे पास नया java.time पैकेज है।
  • यदि आप java.time का उपयोग नहीं कर सकते हैं, तो Joda-Time का उपयोग करें।
  • यदि आप जोडा-टाइम का उपयोग नहीं कर सकते हैं, मानक ISO 8601 प्रारूप में स्ट्रिंग का उपयोग करें।