मैं सिर्फ हाइबरनेट के साथ शुरू हो रही है, और सभी उदाहरण मैं अब तक काफी देखने हाइबरनेट दस्तावेज में ट्यूटोरियल की तरह दिखाई दे रही है:क्या हाइबरनेट-प्रबंधित ऑब्जेक्ट्स के लिए अंतिम फ़ील्ड घोषित करने का कोई तरीका है?
package org.hibernate.tutorial.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
/* Accessor methods... */
}
विशेष रूप से: खेतों में से कोई भी final
के रूप में घोषित कर रहे हैं, और वहां कोई तर्क-तर्क कन्स्ट्रक्टर होना चाहिए ताकि हाइबरनेट फ्रेमवर्क कक्षा को तुरंत चालू कर सके और अपने फ़ील्ड सेट कर सके।
लेकिन यहाँ बात है - मैं वास्तव में मेरी कक्षाएं किसी भी तरह से परिवर्तनशील बनाने पसंद नहीं है जब भी मैं यह बच सकते हैं (जावा प्रथाएं: अपरिवर्तनीय वस्तुओं ऐसा करने के लिए एक बहुत मजबूत तर्क हैं)। तो क्या हाइबरनेट को काम करने का कोई तरीका है, भले ही मैं प्रत्येक फ़ील्ड 'अंतिम' घोषित करना चाहता हूं?
मैं समझता हूं कि हाइबरनेट अपने वर्गों को तुरंत चालू करने के लिए प्रतिबिंब का उपयोग करता है और इसलिए जोखिम लेने के बिना किसी प्रकार के कन्स्ट्रक्टर का आह्वान करने में सक्षम होना चाहिए कि यह गलत कन्स्ट्रक्टर चुनता है या इसके मानकों में से किसी एक को गलत मान देता है, इसलिए नो-एर्ग कन्स्ट्रक्टर का आह्वान करना संभव है और एक ही समय में प्रत्येक फ़ील्ड को सेट करना सुरक्षित है। हालांकि, क्या आवश्यक जानकारी को हाइबरनेट को प्रदान करना संभव नहीं है ताकि यह सुरक्षित रूप से अपरिवर्तनीय वस्तुओं को तुरंत चालू कर सके?
public class Event {
private final Long id;
private final String title;
private final Date date;
public Event(@SetsProperty("id") Long id,
@SetsProperty("title") String title,
@SetsProperty("date") Date date) {
this.id = id;
this.title = title;
this.date = new Date(date.getTime());
}
/* Accessor methods... */
}
@SetsProperty
एनोटेशन फर्जी निश्चित रूप से है, लेकिन नहीं लगता है जैसे कि यह पहुँच से बाहर किया जाना चाहिए।
+1: एक रैपर वर्ग का उपयोग करने पर अच्छा विचार - ऐसा लगता है कि अंतिम कक्षा/फ़ील्ड की आवश्यकता होने पर यह एक अच्छा समाधान होगा। कोई भी अजीबता से बच सकता है जिस पर संस्करण (उत्परिवर्तनीय बनाम रैपर) को उत्परिवर्तनीय संस्करण केवल डेटा एक्सेस कक्षाओं में दिखाई देकर बाहरी रूप से उपयोग किया जाना चाहिए। अंतिम का उपयोग करने के लिए, मेरा मुख्य कारण यह है कि गारंटी देने के बजाय अक्सर यह सुनिश्चित करना आसान होता है कि प्रत्येक फ़ील्ड को निर्माण पर बिल्कुल एक बार असाइन किया जाता है। हमारे पास बहुत सारे डेटा हैं जो कि जेवीएम के पूरे जीवन में निरंतर रहना है जो इसका उपयोग करता है, इसलिए यह स्पष्ट करना उपयोगी होता है। –
अंतिम फ़ील्ड किसी उपयोगकर्ता को गलती से असाइन करने से रोकती हैं जो उनके पास नहीं होनी चाहिए और सूक्ष्म बग पेश करना चाहिए। यदि आप जानते हैं कि कुछ कभी नहीं बदलेगा, तो आप इसे अंतिम बनाना चाहते हैं। सड़क के नीचे यदि आपको लगता है कि इसे बदलना चाहिए, तो आप हमेशा उस बाधा को हटा सकते हैं। – corsiKa