2010-07-29 16 views
8

जावा डेट उपयोगिताओं का उपयोग करते समय वास्तव में क्या मतलब है और कुछ को बहिष्कृत कर दिया गया है। क्या इसका मतलब यह है कि यह उपयोग करने के लिए निराश है, या क्या इसका मतलब है कि इसे मना किया गया है?जावा में बहिष्कृत दिनांक विधियां?

मुझे लगता है कि यह बहिष्कृत तरीकों का उपयोग करने के लिए खराब अभ्यास है, लेकिन मुझे यकीन नहीं है और पता लगाना चाहता था।

उदाहरण के लिए, मैं इस तरह के निम्नलिखित

String date = request.getParameter("date"); 
model.setDate(new Date(date)); 

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

यह ठीक काम करता है कि मेरे पास यह कैसे है, लेकिन यह एक बहिष्कृत विधि का उपयोग कर रहा है।

संपादित करें - मैं वापस चला गया और इस्तेमाल

 
SimpleDateFormat formatter = new SimpleDateFormat(); 
model.setDate(formatter.parse(request.getParameter("date");



तारीख MM/DD/2010/07/23 तरह YYY प्रारूप में है लेकिन मैं एक ParseException हो रही है

यह क्या हो सकता है?

उत्तर

6

आप सही है कि इस बुरी प्रथा है कर रहे हैं। लगभग सभी मामलों में, बहिष्कृत विधियां आपको बताती हैं कि इसके बजाय क्या उपयोग करना है, और यह कोई अपवाद नहीं है (the Javadocs देखें)।

आप एक String के बाहर एक Date बनाने के लिए कोशिश कर रहे हैं। लेकिन स्ट्रिंग में किस प्रारूप में है? इसे कैसे पार्स किया जाना चाहिए? क्या यह ब्रिटेन या यूएस डेट प्रारूप है?

ऐसा करने का "उचित" तरीका SimpleDateFormat का उदाहरण बनाना है, और अपनी टेक्स्ट स्ट्रिंग में गुजरने वाली parse() विधि को कॉल करना है। यह भविष्य में काम करने की गारंटी है, और अब और अधिक मजबूत होगा।

+4

की तोड़ सकता ... या इस तरह के Joda समय के रूप में :) एक बेहतर एपीआई का उपयोग –

+1

खैर ... हाँ। :-) लेकिन नई तारीख वस्तुओं का उपयोग करने के लिए सभी मौजूदा कोड को फिर से लिखने का सुझाव * इस * स्थिति के लिए अधिक है। –

+2

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

-1

यदि आप उनका उपयोग करते हैं तो कुछ भी नहीं तोड़ देगा ... अभी तक।

लेकिन वे भविष्य के संस्करणों में भी हटा दिए जा सकते हैं।

+0

तिथि संबंधित deprecations के अधिकांश, कीड़े के कारण होते हैं तो बातें, खासकर क्योंकि कीड़े –

2

क्या "पदावनत" मतलब

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

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

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

http://download-llnw.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

3

बहिष्कृत वस्तुओं या विधियों का अर्थ केवल यह है कि यदि आप वर्तमान प्रोजेक्ट में इसका उपयोग करना चाहते हैं, तो की आवश्यकता है। कारण यह है कि उनके पास अभी भी विरासत कोडों के लिए है जिन्होंने से पहले को बहिष्कृत विधि का उपयोग किया है, इसे हटा दिया गया था। विशिष्ट उदाहरण StringTokenizer बनाम String.split() विधि है।

अपनी तिथि उदाहरण के लिए स्ट्रिंग टू डेट से रूपांतरण करने के लिए SimpleDateFormat का उपयोग करें। यह आपको दिनांक प्रारूप बनाने की अनुमति देता है जिससे आपकी स्ट्रिंग तिथि को दिनांक वस्तु बनाने के लिए पार्स किया जा सकता है।


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

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 

model.setDate(formatter.parse(request.getParameter("date"))); 

ParseException के कारण होता है है।

+0

यह एमएम/डीडी/yyyy नहीं होना चाहिए? – CoolBeans

+0

@ कूलबीन्स, सच .... मैंने परिवर्तन संपादित किया। –

1

बहिष्कृत साधनों को हटाने के लिए योजना बनाई गई है, क्योंकि यह छोटी या खराब कारण है। अपने तारों को पार्स करने के लिए SimpleDateFormat.parse(); का उपयोग करना बेहतर है।

1

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

संभवतः उनके पास कुछ घटाने का एक अच्छा कारण था, इसलिए आपको जांच करनी चाहिए कि वे क्यों कहते हैं कि कुछ नया कार्य बेहतर है।

बहिष्कृत दिनांक विधियों के मामले में, आमतौर पर इसका मतलब है कि वे सुझाव देते हैं कि अब आप कैलेंडर या SimpleDateFormat कक्षाओं का उपयोग करें। आपके मामले में, शायद बाद वाले।

2

आप सही हैं, इसे बहिष्कृत तरीकों का उपयोग करने के लिए निराश किया गया है। ऐसा इसलिए है क्योंकि इन तरीकों में कुछ स्थितियों में समस्या हो सकती है या अधिक आशावादी समाधानों के साथ प्रतिस्थापित किया गया है और भविष्य के संस्करण भी इनका समर्थन नहीं कर सकते हैं।

0

पदावनत: कुछ है कि जावा के वर्तमान संस्करण में मौजूद है, लेकिन कुछ बिंदु पर भविष्य के संस्करणों से निकाल दिया जाएगा।

अपने संपादित के लिए, आप ठीक से SimpleDateFormat प्रारंभ करने की आवश्यकता है, इसलिए इसे जानता है किस प्रारूप में आ रहा है 1978/07/22 प्रारूप के लिए:।

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

3

लोगों का एक बहुत क्या पदावनत उल्लेख किया है इसका मतलब है, लेकिन मैं क्यों इन तरीकों का बहिष्कार कर रहे हैं का कोई स्पष्टीकरण नहीं नहीं दिख रहा है:

सूर्य (इससे पहले कि वे ओरेकल का हिस्सा थे) Date में अनेक विधियों का पदावनत लोगों तारीख हेरफेर के लिए Calendar/GregorianCalendar वर्गों का उपयोग करने के लिए बजाय।

0

जैसा कि अन्य ने कहा, java.util.Date विधियों को बहिष्कृत कर दिया गया क्योंकि जावा टीम का मानना ​​था कि उनके पास java.util.Calendar में बेहतर समाधान था।

दुर्भाग्यवश वह वर्ग भी भ्रमित, परेशानी और खराब डिजाइन साबित हुई।

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

java.time

सभी पुराने तिथि-समय अवधारणा में इसी तरह के वर्गों जावा 8. नए वर्गों अत्यधिक सफल Joda-Time ढांचे से प्रेरित हैं में निर्मित java.time ढांचे द्वारा का स्थान ले लिया गया है, उसके उत्तराधिकारी के रूप में इरादा, लेकिन फिर से वास्तुकार। JSR 310 द्वारा परिभाषित। ThreeTen-Extra प्रोजेक्ट द्वारा विस्तारित। Tutorial देखें।

java.time.format पैकेज का उपयोग करें और दिनांक-समय मानों के स्ट्रिंग प्रस्तुतियों को उत्पन्न करने के लिए पैकेज का उपयोग करें।

String input = "07/23/2010"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); 

नए वर्गों समय दिन-का-बिना एक दिनांक-केवल मूल्य का प्रतिनिधित्व के लिए LocalDate शामिल हैं।

LocalDate localDate = LocalDate.parse(input , formatter); 

आप एक LOCALDATE को toString फोन यदि आप मानक ISO 8601 प्रारूप, YYYY-MM-DD प्रारूप में दिनांक मान के एक स्ट्रिंग प्रतिनिधित्व मिलता है। अन्य प्रारूपों में एक स्ट्रिंग उत्पन्न करने के लिए, एक और फॉर्मेटर परिभाषित करें। या java.time को किसी विशेष स्थानीयकृत प्रारूप को निर्धारित करने में भारी उठाने के लिए 'लोकलाइज' विधियों को कॉल करें।

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