Records में Custom Methods
Record की कार्यक्षमता बढ़ाने के लिए instance methods और static factory methods जोड़ें।
Records में Custom Methods, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
रिकॉर्ड पर कस्टम विधियाँ
रिकॉर्ड में इंस्टेंस विधियाँ, स्थैतिक विधियाँ और स्थैतिक फ़ील्ड हो सकते हैं—अर्थात ऐसा कोई भी व्यवहार जो रिकॉर्ड के कॉम्पोनेंट से निकाला गया हो या उनसे संबंधित हो।
रिकॉर्ड पर इंस्टेंस विधियाँ
कॉम्पोनेंट के आधार पर व्युत्पन्न मानों की गणना करने या उपयोगी क्रियाएँ प्रदान करने के लिए रिकॉर्ड में विधियाँ जोड़ें।
record Money(long cents, String currency) {
public double amount() { return cents / 100.0; }
public String display() { return String.format("%s %.2f", currency, amount()); }
public Money add(Money other) {
if (!currency.equals(other.currency))
throw new IllegalArgumentException("Currency mismatch");
return new Money(cents + other.cents, currency);
}
public Money multiply(int factor) { return new Money(cents * factor, currency); }
}
Money price = new Money(1999, "USD");
Money tax = new Money(160, "USD");
System.out.println(price.add(tax).display()); // USD 21.59स्थैतिक फ़ैक्टरी विधियाँ
स्थैतिक फ़ैक्टरी विधियाँ रिकॉर्ड बनाने के लिए नामित और पढ़ने में आसान तरीके देती हैं—जब कच्चा कंस्ट्रक्टर कम स्पष्ट हो, तब उसे छिपा देती हैं।
import java.time.*;
record DateRange(LocalDate start, LocalDate end) {
DateRange { if (start.isAfter(end)) throw new IllegalArgumentException(); }
public static DateRange of(LocalDate start, LocalDate end) {
return new DateRange(start, end);
}
public static DateRange thisMonth() {
LocalDate now = LocalDate.now();
return new DateRange(now.withDayOfMonth(1),
now.withDayOfMonth(now.lengthOfMonth()));
}
public long durationDays() {
return ChronoUnit.DAYS.between(start, end) + 1;
}
}
System.out.println(DateRange.thisMonth().durationDays());शर्त-जाँच विधियाँ
रिकॉर्ड अक्सर अपने पास मौजूद डेटा पर शर्तों की जाँच करने के लिए बूलियन शर्त-जाँच विधियाँ उपलब्ध कराते हैं।
record User(String email, String plan, boolean emailVerified) {
public boolean isPro() { return "PRO".equals(plan); }
public boolean canPublish() { return isPro() && emailVerified; }
public boolean isFree() { return "FREE".equals(plan); }
public User withPlan(String newPlan) {
return new User(email, newPlan, emailVerified); // "update"
}
}
User u = new User("alice@example.com", "FREE", true);
System.out.println(u.canPublish()); // false
User upgraded = u.withPlan("PRO");
System.out.println(upgraded.canPublish()); // trueनई प्रतिलिपि-बदलाव विधियाँ
रिकॉर्ड अपरिवर्तनीय होने के कारण, "अपडेट" करने का अर्थ नया रिकॉर्ड बनाना है। नई प्रतिलिपि-बदलाव विधियाँ withX(newValue) पैटर्न का पालन करती हैं।
record ServerConfig(String host, int port, boolean ssl, int timeout) {
public ServerConfig withHost(String h) { return new ServerConfig(h, port, ssl, timeout); }
public ServerConfig withPort(int p) { return new ServerConfig(host, p, ssl, timeout); }
public ServerConfig withSsl(boolean s) { return new ServerConfig(host, port, s, timeout); }
public ServerConfig withTimeout(int t) { return new ServerConfig(host, port, ssl, t); }
}
ServerConfig dev = new ServerConfig("localhost", 8080, false, 30);
ServerConfig prod = dev
.withHost("api.example.com")
.withPort(443)
.withSsl(true)
.withTimeout(60);
System.out.println(prod);फ़ंक्शनल इंटरफ़ेस लागू करने वाले रिकॉर्ड
फ़ंक्शनल इंटरफ़ेस लागू करने वाले रिकॉर्ड को लैम्ब्डा के सीधे विकल्प के रूप में पास किया जा सकता है।
import java.util.function.*;
record Validator<T>(Predicate<T> rule, String message)
implements Predicate<T> {
public boolean test(T value) { return rule.test(value); }
public String validate(T value) {
return test(value) ? null : message;
}
}
Validator<String> notEmpty = new Validator<>(
s -> !s.isBlank(), "Must not be blank");
Validator<String> validEmail = new Validator<>(
s -> s.contains("@"), "Invalid email");
System.out.println(notEmpty.validate("")); // Must not be blank
System.out.println(validEmail.validate("a@b.c")); // null (valid)एग्रीगेशन विधियाँ
संग्रह रखने वाले रिकॉर्ड स्ट्रीम-आधारित एग्रीगेशन विधियाँ उपलब्ध करा सकते हैं।
import java.util.*;
record SalesReport(String region, List<Double> dailySales) {
SalesReport { dailySales = List.copyOf(dailySales); }
public double total() { return dailySales.stream().mapToDouble(Double::doubleValue).sum(); }
public double average() { return dailySales.stream().mapToDouble(Double::doubleValue).average().orElse(0); }
public double max() { return dailySales.stream().mapToDouble(Double::doubleValue).max().orElse(0); }
public int days() { return dailySales.size(); }
}
SalesReport r = new SalesReport("North", List.of(1200.0, 1450.0, 980.0, 1600.0));
System.out.printf("Total: %.0f, Avg: %.0f, Max: %.0f%n", r.total(), r.average(), r.max());
// Total: 5230, Avg: 1307, Max: 1600कस्टम toString ओवरराइड
अपने-आप तैयार होने वाला toString डिबगिंग के लिए उपयोगी है, लेकिन उपयोगकर्ता को दिखाए जाने वाले प्रदर्शन के लिए आप इसे ओवरराइड करना चाह सकते हैं।
record Temperature(double celsius) {
@Override
public String toString() {
return String.format("%.1f\u00b0C / %.1f\u00b0F",
celsius, toFahrenheit());
}
public double toFahrenheit() { return celsius * 9.0/5.0 + 32; }
public double toKelvin() { return celsius + 273.15; }
public static Temperature fromFahrenheit(double f) {
return new Temperature((f - 32) * 5.0/9.0);
}
}
Temperature boiling = new Temperature(100.0);
System.out.println(boiling); // 100.0°C / 212.0°FDDD में मान ऑब्जेक्ट के रूप में रिकॉर्ड
डोमेन-ड्रिवन डिज़ाइन में रिकॉर्ड स्वाभाविक रूप से Value ऑब्जेक्ट से मेल खाते हैं—ऐसे अपरिवर्तनीय प्रकार जो अपनी पहचान के बजाय अपनी विशेषताओं से परिभाषित होते हैं।
// Value objects in a banking domain
record AccountId(String value) {
AccountId { if (!value.matches("ACC-[0-9]{8}")) throw new IllegalArgumentException(); }
}
record Amount(long cents, String currency) {
public static Amount usd(long cents) { return new Amount(cents, "USD"); }
public boolean isPositive() { return cents > 0; }
}
record TransactionId(java.util.UUID value) {
public static TransactionId generate() {
return new TransactionId(java.util.UUID.randomUUID());
}
}
AccountId id = new AccountId("ACC-12345678");
Amount amount = Amount.usd(5000);
TransactionId txId = TransactionId.generate();
System.out.println(id + " " + amount + " " + txId);Comparator से रिकॉर्ड की तुलना
एक्सेसर की ओर संकेत करने वाले विधि संदर्भों के साथ Comparator.comparing का उपयोग करके रिकॉर्ड को क्रमबद्ध किया जा सकता है।
import java.util.*;
record Employee(String name, String dept, double salary) {}
List<Employee> employees = List.of(
new Employee("Alice", "Engineering", 95000),
new Employee("Bob", "Marketing", 72000),
new Employee("Charlie", "Engineering", 105000),
new Employee("Diana", "Marketing", 81000)
);
// Sort by dept, then salary descending
employees.stream()
.sorted(Comparator.comparing(Employee::dept)
.thenComparing(Comparator.comparingDouble(Employee::salary).reversed()))
.forEach(e -> System.out.printf("%-10s %-15s %.0f%n",
e.name(), e.dept(), e.salary()));रिकॉर्ड पर स्थैतिक यूटिलिटी विधियाँ
रिकॉर्ड में ऐसी स्थैतिक विधियाँ हो सकती हैं जो कई रिकॉर्ड इंस्टेंस के साथ काम करती हैं—रूपांतरण और तुलना के लिए उपयोगी।
import java.util.*;
import java.util.stream.*;
record Product(String id, String category, double price) {
public static Map<String, DoubleSummaryStatistics> statsByCategory(
List<Product> products) {
return products.stream().collect(
Collectors.groupingBy(Product::category,
Collectors.summarizingDouble(Product::price)));
}
public static Optional<Product> cheapest(List<Product> products) {
return products.stream()
.min(Comparator.comparingDouble(Product::price));
}
}त्वरित जाँच
आप रिकॉर्ड के किसी फ़ील्ड को "अपडेट" करना चाहते हैं। सही तरीका क्या है?
पुनरावृत्ति: रिकॉर्ड पर कस्टम विधियाँ
मुख्य बातें:
- रिकॉर्ड में इंस्टेंस विधियाँ, स्थैतिक विधियाँ और स्थैतिक फ़ील्ड हो सकते हैं
- परिकलित गुणों को विधियों के रूप में जोड़ें (area(), total(), display())
- पढ़ने में आसान नामित कंस्ट्रक्टर के लिए स्थैतिक फ़ैक्टरी विधियों का उपयोग करें
- अपरिवर्तनीय अपडेट के लिए नई प्रतिलिपि-बदलाव विधियाँ (withX) लागू करें
- डिबग आउटपुट के बजाय उपयोगकर्ता को दिखाए जाने वाले प्रदर्शन के लिए toString() ओवरराइड करें
- रिकॉर्ड डोमेन-ड्रिवन डिज़ाइन में Value ऑब्जेक्ट से स्वाभाविक रूप से मेल खाते हैं
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Records में Custom Methods” पाठ निःशुल्क है?
हाँ—“Records में Custom Methods” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Records में Custom Methods” में मैं क्या सीखूँगा?
Record की कार्यक्षमता बढ़ाने के लिए instance methods और static factory methods जोड़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Records में Custom Methods” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Records का परिचय
- Compact Constructors और Validation
- Records में Custom Methods
- Records बनाम Classes बनाम Lombok