2013-08-07 9 views
18

यह आपके लिए बेवकूफ लग सकता है, लेकिन मुझे अपने @Entity एस में एक खाली कन्स्ट्रक्टर को परिभाषित करने की आवश्यकता क्यों है?जावा इकाई - मुझे खाली कन्स्ट्रक्टर की आवश्यकता क्यों है?

मैंने देखा हर ट्यूटोरियल ने कहा: प्रत्येक इकाई को एक खाली कन्स्ट्रक्टर की आवश्यकता होती है।

लेकिन जावा हमेशा आपको एक डिफ़ॉल्ट अदृश्य खाली कन्स्ट्रक्टर देता है (यदि आप एक को फिर से परिभाषित नहीं करते हैं)।

धन्यवाद।

EDIT

मुझे लगता है कि एक अर्थपूर्ण समस्या है। मुझे "ज़रूरत" से क्या समझा गया था लिखना था।

अर्थ: हमेशा अपनी इकाई में एक खाली कन्स्ट्रक्टर लिखें।

उदाहरण:

@Entity 
public class MyEntity implements Serializable { 

    @Id 
    private String str; 

    public MyEntity(){} 

    //here getter and setter 
} 

लेकिन जावा हमेशा जब आप इसे फिर से परिभाषित नहीं है (पैरामीटर के साथ एक दूसरे को लिखने) आप इसे खाली निर्माता देता है।

इस मामले में यह खाली कन्स्ट्रक्टर लिखना बेकार लगता है।

+0

खैर, यह हमेशा जरूरी नहीं है जब तक आप अपने डेटा के सदस्यों को विशिष्ट मान देना चाहते है। –

+1

@ JavaNewbie_M107 एम्पपी कन्स्ट्रक्टर अनिवार्य है (हां यह डिफ़ॉल्ट हो सकता है, लेकिन फिर भी, कोई तर्क के साथ कन्स्ट्रक्टर द्वारा अवश्य होना चाहिए) – Antoniossss

+0

यदि आपके पास सार्वजनिक कक्षा है, तो जावा वास्तव में आपको एक खाली _visible_ (और _invisble_) खाली कन्स्ट्रक्टर देता है। – steffen

उत्तर

25

आपके दृढ़ता ढांचे द्वारा प्रतिबिंब के माध्यम से एक नया उदाहरण बनाने के लिए एक खाली कन्स्ट्रक्टर की आवश्यकता है। यदि आप कक्षा के लिए तर्क के साथ कोई अतिरिक्त कन्स्ट्रक्टर प्रदान नहीं करते हैं, तो आपको एक खाली कन्स्ट्रक्टर प्रदान करने की आवश्यकता नहीं है क्योंकि आपको प्रति डिफ़ॉल्ट एक मिलता है।

तुम भी @PersistenceConstructor एनोटेशन जो

@PersistenceConstructor 
public Movie(Long id) { 
    this.id = id; 
} 

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

+1

तो ढांचे खराब हैं, क्योंकि वे आसानी से असुर – Enerccio

+0

का उपयोग कर सकते हैं, तो आप कह रहे हैं कि सामान्य रूप से ढांचे खराब हैं क्योंकि वे संभावित रूप से असुरक्षित उपयोग कर सकते हैं? मैं असहमत नहीं हो सकता। सबसे पहले, कन्स्ट्रक्टर इंजेक्शन के लिए आपको असुरक्षित की आवश्यकता नहीं है, प्रतिबिंब चाल करेगा। दूसरा, विकल्प क्या है, अपने आप सबकुछ लिखने की कोशिश कर रहा है कि एक बड़ा डेवलपर समुदाय पहले से ही आपके लिए कर चुका है? – u6f6o

+0

नहीं, मैं कह रहा हूं कि फ्रेमवर्क जो आपको खाली कन्स्ट्रक्टर प्रदान करने की आवश्यकता है, वे खराब हैं क्योंकि यदि आप खाली कन्स्ट्रक्टर प्रदान नहीं करते हैं तो वे 'असुरक्षित' का उपयोग कर सकते हैं – Enerccio

3

स्पष्ट रूप से एक डिफ़ॉल्ट कन्स्ट्रक्टर को परिभाषित करना जरूरी नहीं है जब तक आप इकाई के लिए एक और कन्स्ट्रक्टर प्रदान नहीं करते। यदि आप एक और कन्स्ट्रक्टर प्रदान करते हैं, तो डिफ़ॉल्ट कन्स्ट्रक्टर के हस्ताक्षर वाले एक से अलग, डिफॉल्ट कन्स्ट्रक्टर नहीं बनाया जाएगा।

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

+1

मैं दृढ़ता से असहमत हूं, उदाहरण के लिए इकाई को प्रतिबिंब द्वारा निर्माण के लिए खाली कन्स्ट्रक्टर होना चाहिए। – Antoniossss

+0

आप किस जेपीए कार्यान्वयन से परिचित हैं? हाइबरनेट का उपयोग करके मुझे कभी भी एक डिफॉल्ट कन्स्ट्रक्टर शामिल करने के लिए मजबूर नहीं किया जाता है जब तक उपर्युक्त परिस्थितियां मौजूद नहीं होतीं। –

+0

आपको कोई तर्क के साथ कन्स्ट्रक्टर प्रदान नहीं करना है, क्योंकि आपके पास डिफ़ॉल्ट है - तो आपके पास एक है। मैंने नहीं लिखा था कि आपको अपना खाली सी सही लिखना है? :) – Antoniossss

17

लेकिन जावा हमेशा आपको एक डिफ़ॉल्ट अदृश्य खाली कन्स्ट्रक्टर देता है (यदि आप एक को फिर से परिभाषित नहीं करते हैं)।

यह कथन केवल तभी सही है जब आप अपनी कक्षा में कोई भी निर्माता प्रदान नहीं करते हैं। यदि आपकी कक्षा में एक तर्क निर्माता प्रदान किया जाता है, तो jvm नो-तर्क कन्स्ट्रक्टर नहीं जोड़ देगा।

1

असल में आपको इसे लिखने की आवश्यकता नहीं है। आपके पास डिफ़ॉल्ट रूप से है। कभी-कभी आप, उपयोगकर्ताओं को डिफ़ॉल्ट

public class MyClass{ 

private MyClass(){} 

} 

उपयोग करने के लिए singelton पैटर्न के लिए रोकने के लिए private निर्माता बना सकते हैं, उदाहरण के लिए यदि आप डिफ़ॉल्ट निर्माता का उपयोग कर ब्लॉक कर सकते हैं।

कभी कभी, जब आप वस्तु को स्ट्रिंग JSON डेटा कन्वर्ट करने के लिए Gson प्लगइन का उपयोग, यह डिफ़ॉल्ट निर्माता लिखने के लिए मांग है, अन्यथा यह जेपीए टैग से

-1

काम नहीं करता है, मुझे लगता है कि आप के साथ काम कर रहे हैं जावा सेम प्रत्येक बीन में निम्न गुण होने की आवश्यकता होती है:

  1. सभी मुख्य उदाहरण चर के लिए गेटर्स और सेटर्स।

  2. एक खाली कन्स्ट्रक्टर।

  3. इसके सभी आवृत्ति चर private होना चाहिए।

इस प्रकार कथन: "प्रत्येक इकाई को एक खाली निर्माता की आवश्यकता होती है"।

0

जावा आपको हमेशा एक डिफ़ॉल्ट अदृश्य खाली कन्स्ट्रक्टर नहीं देता है यदि आपकी कक्षा को तर्क निर्माता मिल गया है, तो आपको खाली कन्स्ट्रक्टर को स्वयं ही परिभाषित करना होगा।

3

जैसा कि आपने "जेपीए" टैग निर्दिष्ट किया है, मुझे लगता है कि आपका प्रश्न केवल जेपीए पर लागू होता है और सामान्य रूप से खाली कन्स्ट्रक्टर नहीं।

पर्सिटेंस फ्रेमवर्क अक्सर आपकी ऑब्जेक्ट्स को तुरंत चालू करने के लिए प्रतिबिंब और अधिक विशेष रूप से Class<T>.newInstance() का उपयोग करते हैं, फिर फ़ील्ड सेट करने के लिए आत्मनिरीक्षण द्वारा गेटर्स/सेटर्स को कॉल करें।

यही कारण है कि आपको खाली कन्स्ट्रक्टर और गेटर्स/सेटर्स की आवश्यकता है।

देखें this StackOverflow question about empty constructors in Hibernate.

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