"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > जावा में रिकॉर्ड्स बनाम कक्षाएं

जावा में रिकॉर्ड्स बनाम कक्षाएं

2024-11-02 को प्रकाशित
ब्राउज़ करें:144

Records vs Clases en Java

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

अचल स्थिति

एक अपरिवर्तनीय वस्तु वह है जिसकी विशेषताओं को एक बार वस्तु बनाने के बाद संशोधित नहीं किया जा सकता है। रिकॉर्ड्स के मामले में, ये अपरिवर्तनीय हैं, यानी, एक बार रिकॉर्ड प्रकार का ऑब्जेक्ट बनाया गया है, तो इसकी विशेषताओं को संशोधित नहीं किया जा सकता है। दूसरी ओर, कोई वर्ग अपरिवर्तनीय हो भी सकता है और नहीं भी, यह इस बात पर निर्भर करता है कि इसे कैसे कार्यान्वित किया जाता है। यह भाग डेटा की अखंडता सुनिश्चित करता है और इसे गलती से संशोधित होने से रोकता है।

उद्देश्य

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

  • प्रत्येक फ़ील्ड के लिए निजी विशेषताएँ।
  • प्रत्येक फ़ील्ड के लिए गेटर्स।
  • एक कंस्ट्रक्टर जो सभी फ़ील्ड को आरंभ करता है।
  • एक समान विधि जो समानता के लिए वस्तुओं की तुलना करती है।
  • एक हैशकोड विधि जो फ़ील्ड के आधार पर एक हैश कोड उत्पन्न करती है।
  • एक टूस्ट्रिंग विधि जो फ़ील्ड का एक स्ट्रिंग प्रतिनिधित्व उत्पन्न करती है।

उदाहरण के लिए, यदि आपके पास दो विशेषताओं नाम और अंतिम नाम वाला एक व्यक्ति वर्ग है, तो आप इसे इस प्रकार लिख सकते हैं:

public class Person {

    private final String name;
    private final String lastName;

    public Person(String name, String lastName) {
        this.name = name;
        this.lastName = lastName;
    }

    public String getName() {
        return name;
    }

    public String getLastName() {
        return lastName;
    }

    @Override
    public String toString() {
        return "Person{"   "name='"   name   '\''  
                ", lastName='"   lastName   '\''  
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person person)) return false;
        return Objects.equals(getName(), person.getName()) && Objects.equals(getLastName(), person.getLastName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getLastName());
    }
}

यह कार्य का एक समाधान है, लेकिन वास्तव में जिस चीज़ की आवश्यकता है उसके लिए यह बहुत सारा कोड है। यदि क्लास में अधिक विशेषताएँ होतीं, तो यह लिखने के लिए और भी लंबा कोड होता, भले ही इसे IDE या GitHub Copilot जैसे प्लगइन की मदद से किया जाता। एक बेहतर समाधान यह होगा कि हम अपनी कक्षा को डेटा-क्लास के रूप में घोषित करें, अर्थात, एक ऐसा वर्ग जो केवल डेटा संग्रहीत करता है, और इसका कोई विशिष्ट व्यवहार नहीं होता है, और यहीं पर रिकॉर्ड आते हैं।

इस तरह व्यक्ति वर्ग को रिकॉर्ड के रूप में निम्नानुसार फिर से लिखा जा सकता है:

public record Person(String name, String lastName) { }

यह स्वचालित रूप से प्रत्येक विशेषता के लिए बराबर, हैशकोड और टूस्ट्रिंग विधियां, साथ ही गेटर विधियां उत्पन्न करता है।

रिकॉर्ड और क्लास के बीच क्या अंतर हैं?

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

रिकॉर्ड का उपयोग कब करना है और क्लास का उपयोग कब करना है?

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

अतिरिक्त: परिवर्तनशील विशेषताओं के साथ रिकॉर्ड करें

आइए निम्नलिखित उदाहरण पर विचार करें, विशेषता नाम और कीमत के साथ दो रिकॉर्ड उत्पाद हैं, और ArrayList प्रकार के एकल विशेषता उत्पादों के साथ कार्ट और उत्पादों की संख्या और कार्ट की कुल संख्या प्राप्त करने के लिए कुछ तरीके हैं।

package org.jordi.example;

public record Product(String name, double price) { }
package org.jordi.example;

import java.util.ArrayList;
import java.util.List;

public record Cart(List products) {

    public Cart() {
        this(new ArrayList());
    }

    public int getQuantity() {
        return this.products.size();
    }

    public double getTotal() {
        return this.products.stream().mapToDouble(Product::price).sum();
    }
}

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

package org.jordi.example;

public class Main {
    public static void main(String[] args) {
        Product water = new Product("Water", 15);
        Product milk = new Product("Milk", 22);

        Cart cart = new Cart();
        cart.products().add(water);
        cart.products().add(milk);
        System.out.println("Price: "   cart.getTotal());

        cart.products().clear();
        System.out.println("Quantity: "   cart.getQuantity());
        System.out.println("Price: "   cart.getTotal());
    }
}

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

विज्ञप्ति वक्तव्य इस लेख को पुन: प्रस्तुत किया गया है: https://dev.to/asjordi/records-vs-clases-en-java-1bb6?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3