Record'larda Özel Yöntemler
Record işlevselliğini zenginleştirmek için örnek yöntemleri ve statik fabrika yöntemlerini ekleyin.
Record'larda Özel Yöntemler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Kayıtlar Üzerinde Özel Yöntemler
Kayıtlar; kayıt bileşenlerinden türeyen veya onlarla ilişkili her türlü davranış için örnek yöntemleri, statik yöntemleri ve statik alanları içerebilir.
Kayıtlarda Örnek Yöntemleri
Bileşenlere dayalı türetilmiş değerleri hesaplamak veya kullanışlı işlemler sunmak için kayıtlara yöntemler ekleyin.
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.59Statik Üretim Yöntemleri
Statik üretim yöntemleri, kayıtları oluşturmanın adlandırılmış ve okunabilir yollarını sunar; daha az anlaşılır olduğu durumlarda ham kurucuyu gizler.
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());Koşul Yöntemleri
Kayıtlar, tuttukları verilerdeki koşulları denetlemek için sıklıkla boolean koşul yöntemleri sunar.
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()); // trueDeğiştirilmiş Kopya Yöntemleri
Kayıtlar değişmez olduğundan, "güncelleme" yeni bir kayıt oluşturmak anlamına gelir. Değiştirilmiş kopya yöntemleri withX(newValue) örüntüsünü izler.
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);İşlevsel Arayüzleri Uygulayan Kayıtlar
İşlevsel bir arayüzü de uygulayan bir kayıt, lambda karşılığı olarak doğrudan aktarılabilir.
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)Toplama Yöntemleri
Koleksiyonları tutan kayıtlar, akış tabanlı toplama yöntemleri sunabilir.
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Özel toString Geçersiz Kılması
Otomatik oluşturulan toString hata ayıklama için kullanışlı olsa da, kullanıcıya gösterilecek içerik için bunu geçersiz kılmak isteyebilirsiniz.
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'de Value Nesneleri Olarak Kayıtlar
Alan Odaklı Tasarımda, kayıtlar Value nesnelerine doğal biçimde karşılık gelir; bunlar kimlikleriyle değil, öznitelikleriyle tanımlanan değişmez türlerdir.
// 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 ile Kayıtları Karşılaştırma
Kayıtlar, erişim yöntemlerini gösteren yöntem başvurularıyla Comparator.comparing kullanılarak sıralanabilir.
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()));Kayıtlarda Statik Yardımcı Yöntemler
Kayıtlar, birden çok kayıt örneğiyle çalışan statik yöntemlere sahip olabilir; bunlar dönüşümler ve karşılaştırmalar için kullanışlıdır.
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));
}
}Kısa Denetim
Bir kayıt alanını "güncellemek" istiyorsunuz. Doğru yaklaşım nedir?
Özet: Kayıtlar Üzerinde Özel Yöntemler
Temel çıkarımlar:
- Kayıtlar örnek yöntemlerine, statik yöntemlere ve statik alanlara sahip olabilir
- Hesaplanan özellikleri yöntem olarak ekleyin (area(), total(), display())
- Okunabilir, adlandırılmış kurucular için statik üretim yöntemlerini kullanın
- Değişmez güncellemeler için değiştirilmiş kopya yöntemlerini (withX) uygulayın
- Hata ayıklama çıktısı yerine kullanıcıya gösterilecek içerik için toString() yöntemini geçersiz kılın
- Kayıtlar, Alan Odaklı Tasarımdaki Value nesnelerine doğal biçimde karşılık gelir
Sıkça Sorulan Sorular
“Record'larda Özel Yöntemler” dersi ücretsiz mi?
Evet — “Record'larda Özel Yöntemler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Record'larda Özel Yöntemler” dersinde ne öğreneceğim?
Record işlevselliğini zenginleştirmek için örnek yöntemleri ve statik fabrika yöntemlerini ekleyin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Record'larda Özel Yöntemler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Record'lara Giriş
- Kısa Yapıcılar ve Doğrulama
- Record'larda Özel Yöntemler
- Record'lar, Sınıflar ve Lombok