java - जावा में क्षणिक फ़ील्ड क्यों हैं?




field transient (9)

जावा में क्षणिक फ़ील्ड क्यों हैं?


Google क्षणिक अर्थ == के अनुसार केवल थोड़े समय के लिए स्थायी; नश्वर।

अब यदि जावा उपयोग क्षणिक कीवर्ड में कुछ भी क्षणिक बनाना चाहते हैं।

प्रश्न: क्षणिक का उपयोग कहां करें?

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

क्षणिक int परिणाम = 10;

नोट: क्षणिक चर स्थानीय नहीं हो सकते हैं।


आपको उन चरों को परिभाषित करने की अनुमति देने के लिए जिन्हें आप क्रमबद्ध नहीं करना चाहते हैं।

किसी ऑब्जेक्ट में आपके पास ऐसी जानकारी हो सकती है जिसे आप धारावाहिक / जारी रखना नहीं चाहते (संभवतया किसी मूल फैक्ट्री ऑब्जेक्ट का संदर्भ), या शायद यह धारावाहिक को समझ में नहीं आता है। इन्हें 'क्षणिक' के रूप में चिह्नित करने का अर्थ है धारावाहिक तंत्र इन क्षेत्रों को अनदेखा कर देगा।


इसकी आवश्यकता होती है जब आप कुछ संवेदनशील डेटा साझा नहीं करना चाहते हैं जो क्रमबद्धता के साथ जाते हैं।


एक transient चर एक चर है जिसे क्रमबद्ध नहीं किया जा सकता है।

इसका एक उदाहरण जब यह उपयोगी हो सकता है जो दिमाग में आता है, वैरिएबल जो विशिष्ट ऑब्जेक्ट इंस्टेंस के संदर्भ में केवल समझ में आता है और जब आप ऑब्जेक्ट को क्रमबद्ध और deserialized किया जाता है तो यह अमान्य हो जाता है। उस स्थिति में यह चर उपयोगी है कि वे चर के बदले null हो जाएं ताकि जब आवश्यक हो तो आप उन्हें उपयोगी डेटा के साथ फिर से शुरू कर सकें।


मूल जावा के अलावा सीरियलाइजेशन सिस्टम भी इस संशोधक का उपयोग कर सकते हैं। उदाहरण के लिए, हाइबरनेट, @Transient या क्षणिक संशोधक के साथ चिह्नित फ़ील्ड को जारी नहीं रखेगा । Terracotta भी इस संशोधक का सम्मान करता है।

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


मेरा छोटा योगदान:

जावा में क्षणिक चर क्या है?
सरल वाक्य में किसी भी चर जो क्षणिक कीवर्ड के साथ संशोधित होता है जावा में क्षणिक चर बन जाता है।

हमें जावा में क्षणिक चर की आवश्यकता क्यों है?
क्षणिक कीवर्ड आपको क्रमबद्ध प्रक्रिया पर कुछ नियंत्रण प्रदान करता है और आपको क्रमिक प्रक्रिया से कुछ ऑब्जेक्ट गुणों को बाहर करने के लिए लचीलापन देता है। कुछ समय यह किसी ऑब्जेक्ट के कुछ विशेषताओं को क्रमबद्ध करने के लिए समझ में नहीं आता है, हम देखेंगे कि कौन से चर को क्रमबद्ध नहीं किया जाना चाहिए और अगले खंड में क्षणिक बनाया जाना चाहिए।

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


सीरियलाइजेशन एक ऑब्जेक्ट के राज्यों को लगातार प्रारूप (जैसे फ़ाइल स्ट्रीम या डेटाबेस) में सहेजने की प्रक्रिया है, और बाद में उन्हें स्ट्रीम (डी-सीरियलाइजेशन) से वापस बहाल करना है। जावा में, क्लास का ऑब्जेक्ट serializable है यदि कक्षा java.io.Serializable इंटरफ़ेस लागू करती है। यह एक मार्कर इंटरफ़ेस है जो JVM को बताता है कि कक्षा क्रमबद्ध करने के लिए योग्य है।

public class User implements Serializable {

    private static final long serialVersionUID = 1234L;

    private String username;
    private String email;
    private transient String password;
    private Date birthday;
    private int age;

    public User(String username, String email, String password, Date birthday,
            int age) {
        this.username = username;
        this.email = email;
        this.password = password;
        this.birthday = birthday;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("username: " + username);
        System.out.println("email: " + email);
        System.out.println("password: " + password);
        System.out.println("birthday: " + birthday);
        System.out.println("age: " + age);
    }

    // getters and setters

}

इस मॉडल वर्ग में तीन महत्वपूर्ण बिंदु हैं: इसे सीरियलज़ेबल इंटरफ़ेस लागू करना होगा। अन्यथा, कक्षा के किसी ऑब्जेक्ट को क्रमबद्ध करने का प्रयास करते समय, हमें java.io.NotSerializableException मिलेगा। एक निरंतर नामित serialVersionUID घोषित किया गया है और एक लंबा मूल्य असाइन किया गया है:

private static final long serialVersionUID = 1234L;

यह एक पारंपरिक स्थिरता है जिसे घोषित किया जाना चाहिए जब एक वर्ग Serializable इंटरफ़ेस लागू करता है। धारावाहिक संस्करण यूआईडी दृढ़ता से कक्षा के ऑब्जेक्ट्स के क्रमबद्ध और डी-क्रमबद्ध संस्करणों के बीच संगतता सुनिश्चित करता है, क्योंकि विभिन्न कंप्यूटर और सिस्टम पर क्रमबद्धरण और डी-क्रमबद्धता की प्रक्रिया हो सकती है। यद्यपि यह घोषणा वैकल्पिक है, फिर भी एक धारावाहिक वर्ग के लिए serialVersionUID घोषित करने की हमेशा अनुशंसा की जाती है।

ध्यान दें कि पासवर्ड फ़ील्ड क्षणिक के रूप में चिह्नित है:

private transient String password;

क्योंकि हम ऑब्जेक्ट को क्रमबद्ध करते समय पासवर्ड स्टोर नहीं करना चाहते हैं। नियम यह है कि, जब एक चर को क्षणिक के रूप में चिह्नित किया जाता है, तो इसके ऑब्जेक्ट को क्रमिकरण के दौरान क्रमबद्ध नहीं किया जाएगा।

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

जावा द्वारा समर्थित एक्सेस संशोधक स्थिर, अंतिम, सार, सिंक्रनाइज़, देशी, अस्थिर, क्षणिक और सख्त एफपी हैं।

निम्नलिखित तालिका एक्सेस विनिर्देशकों और संशोधक जावा की सूची देता है जिसे चर, विधियों और वर्गों पर लागू किया जा सकता है।

SPECIFIER/MODIFIER  LOCAL VARIABLE  INSTANCEVARIABLE    METHOD   CLASS
public              NA              A                   A         A
protected           NA              A                   A         NA
default             A               A                   A         A
private             NA              A                   A         NA
final               A               A                   A         A
static              NA              A                   A         NA
synchronized        NA              NA                  A         NA
native              NA              NA                  A         NA
volatile            NA              A                   NA        NA
transient           NA              A                   NA        NA
strictfp            NA              NA                  A         A

transient का उपयोग यह इंगित करने के लिए किया जाता है कि एक वर्ग क्षेत्र को क्रमबद्ध करने की आवश्यकता नहीं है। शायद सबसे अच्छा उदाहरण एक Thread फ़ील्ड है। आमतौर पर Thread को क्रमबद्ध करने का कोई कारण नहीं है, क्योंकि इसकी स्थिति बहुत 'प्रवाह विशिष्ट' है।


जावा में transient कीवर्ड का उपयोग यह इंगित करने के लिए किया जाता है कि एक फ़ील्ड को क्रमबद्ध नहीं किया जाना चाहिए।

जावा भाषा विशिष्टता से, जावा एसई 7 संस्करण , खंड 8.3.1.3। transient फ़ील्ड :

वेरिएबल को इंगित करने के लिए transient चिह्नित किया जा सकता है कि वे किसी ऑब्जेक्ट की लगातार स्थिति का हिस्सा नहीं हैं।

उदाहरण के लिए, आपके पास ऐसे फ़ील्ड हो सकते हैं जो अन्य क्षेत्रों से प्राप्त किए गए हों, और केवल क्रमिक रूप से किया जाना चाहिए, बजाय राज्य को धारावाहिकरण के माध्यम से जारी रखा जाना चाहिए।

यहां GalleryImage क्लास है जिसमें एक छवि और छवि से प्राप्त थंबनेल शामिल है:

class GalleryImage implements Serializable
{
    private Image image;
    private transient Image thumbnailImage;

    private void generateThumbnail()
    {
        // Generate thumbnail.
    }

    private void readObject(ObjectInputStream inputStream)
            throws IOException, ClassNotFoundException
    {
        inputStream.defaultReadObject();
        generateThumbnail();
    }    
}

इस उदाहरण में, थंबनेल इमेज एक थंबनेल छवि है जो उत्पन्न थंबनेल विधि का आह्वान करके generateThumbnail होती है।

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

readObject के समय, readObject विधि ऑब्जेक्ट की स्थिति को उस राज्य में वापस बहाल करने के लिए आवश्यक संचालन करने के लिए कहा जाता है जिस पर क्रमबद्धता हुई थी। यहां, थंबनेल को उत्पन्न करने की आवश्यकता है, इसलिए readObject विधि ओवरराइड है ताकि थंबनेल जेनरेट थंबनेल विधि को कॉल करके उत्पन्न किया जाएगा।

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





transient