2011-09-14 13 views
20

क्या कोई मुझे बता सकता है कि जेपीए double प्रकार फ़ील्ड प्रकार के रूप में क्यों उपयोग करता है, लेकिन javax.validation.constraints में बीन सत्यापन कॉन्स्टेंट्स (यानी @Min/@Max) इसका समर्थन नहीं करते हैं? मुझे पता है कि प्रलेखन कहता है कि यह गोल करने वाली त्रुटियों के कारण है, लेकिन यदि मैं फ़ील्ड प्रकार को double मानता हूं तो मैं पहले से ही स्वीकार करता हूं कि मुझे स्पष्ट परिशुद्धता के बारे में बहुत कुछ परवाह नहीं है।बीन सत्यापन क्यों न्यूनतम/अधिकतम बाधाएं डबल प्रकार का समर्थन नहीं करती हैं?

परिदृश्य मैं इस दुविधा में भाग गया निम्नलिखित है: मेरे पास एक संस्था है जो पृथ्वी की सतह पर एक बिंदु का प्रतिनिधित्व करती है। यदि परिशुद्धता कुछ सेंटीमीटर के भीतर है तो यह ठीक है। ऐसा कुछ दिखता है:

@Entity 
public class Point { 

    /** 
    * The longitude in radians. 
    */ 
    @Min(-Math.Pi) 
    @Max(Math.Pi) 
    double longitude; 
    /** 
    * The latitude in radians. 
    */ 
    @Min(-Math.Pi/2) 
    @Max(Math.Pi/2) 
    double latitude; 

} 

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

+0

कृपया ध्यान दें कि JPA और बीन मान्यकरण दो पूरी तरह से अलग API हैं में से एक के लिए तय करने के लिए किया था। मैंने शीर्षक तय किया, तदनुसार कुछ शब्द और टैग। शानदार सवाल उदाहरण बीटीडब्ल्यू। आप क्या बीन सत्यापन कार्यान्वयन का उपयोग कर रहे हैं? हाइबरनेट वैलिडेटर? – BalusC

+0

हां, अभी मैं हाइबरनेट वैलिडेटर का उपयोग कर रहा हूं। –

+1

आप वास्तव में न्यूनतम या अधिकतम (कम से कम हाइबरनेट वैलिडेटर में) के साथ डबल को एनोटेट कर सकते हैं। डबल प्रकार समर्थित है। आपकी समस्या यह प्रतीत होती है कि आप बाधा पैरामीटर के रूप में डबल निर्दिष्ट नहीं कर सकते हैं। वहाँ spec वास्तव में एक लंबे समय तक लागू करता है। क्या आपने DecimalMin और DecimalMax का उपयोग करने पर विचार किया है? आप अपने न्यूनतम और अधिकतम मान स्ट्रिंग के रूप में निर्दिष्ट कर सकते हैं। – Hardy

उत्तर

6

यह गोल करने की वजह से है। लेकिन समस्या की वजह से नहीं कि एक डबल संभव संख्या को व्यक्त करने के लिए पर्याप्त सही नहीं हो सकता है। यह अधिक है कि एनोटेशन वैल्यू (Min और Max) प्रकार का लंबा है, इसलिए यह दशमलव स्थानों के साथ किसी भी संख्या को व्यक्त नहीं कर सकता है। दूसरी तरफ आप उन सभी संख्याओं को सटीक व्यक्त करने के लिए डबल का उपयोग नहीं कर सकते हैं जो लंबे समय तक व्यक्त कर सकते हैं।

तो एपीआई डिजाइनरों के दो तरीके (लंबी या डबल)

+0

उस अंतर्दृष्टि के लिए धन्यवाद, मैंने इसे उस दृष्टिकोण से नहीं देखा। लेकिन चूंकि 'लम्बी' और 'डबल' दोनों 64 बिट्स का उपयोग करते हैं, इसलिए एक आइसोमोर्फिज्म होता है जो तुलना को संरक्षित करता है। मुझे लगता है कि यह आइसोमोर्फिज्म 'डबल' या 'फ्लोट' में नहीं बनाया गया है, लेकिन यह 'बिगडिसीमल' को 'लम्बा' में परिवर्तित करने से अधिक जटिल समस्या नहीं होनी चाहिए। तो, यह बताता है कि क्यों 'डबल' के लिए समर्थन अंतर्निहित नहीं है, लेकिन यह दिखाता है कि यह संभव है। और यह समर्थित होने के लिए पर्याप्त होना चाहिए, आईएमओ। –

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

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