Pembina Padat dan Pengesahan
Tambahkan logik pengesahan dalam pembina padat untuk memastikan integriti data.
Pembina Padat dan Pengesahan ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Pembina Padat
Pembina padat dalam rekod dijalankan sebelum komponen diberikan nilai. Pembina ini membolehkan anda mengesahkan atau menormalkan data tanpa mengulangi pemberian nilai kepada komponen.
Pembina Standard berbanding Pembina Padat
Pembina kanonik standard memberikan nilai kepada komponen secara jelas. Pembina padat tidak memerlukan senarai parameter dan pemberian nilai — kedua-duanya berlaku secara automatik selepas badan pembina dijalankan.
// Standard canonical constructor
record Range(int min, int max) {
Range(int min, int max) {
if (min > max) throw new IllegalArgumentException("min > max");
this.min = min; // explicit assignment
this.max = max;
}
}
// Compact constructor (same behavior, less code)
record Range2(int min, int max) {
Range2 { // no parameter list, no assignments
if (min > max) throw new IllegalArgumentException("min > max");
// components are assigned automatically after this block
}
}Pengesahan dalam Pembina Padat
Pembina padat ialah cara standard untuk mengesahkan data rekod. Lemparkan pengecualian lebih awal untuk menguatkuasakan invarian.
record Email(String address) {
Email {
if (address == null || address.isBlank())
throw new IllegalArgumentException("Email cannot be blank");
if (!address.contains("@"))
throw new IllegalArgumentException("Invalid email: " + address);
address = address.toLowerCase().strip(); // normalize (Java 16+)
}
}
Email e = new Email(" Alice@Example.com ");
System.out.println(e.address()); // alice@example.com
try { new Email("not-an-email"); }
catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); }Penormalan dalam Pembina Padat
Anda boleh mengubah suai pemboleh ubah komponen dalam pembina padat sebelum nilainya diberikan. Dengan cara ini, data dinormalkan semasa pembinaan.
record PersonName(String firstName, String lastName) {
PersonName {
firstName = capitalize(firstName);
lastName = capitalize(lastName);
}
private static String capitalize(String s) {
if (s == null || s.isEmpty()) return s;
return Character.toUpperCase(s.charAt(0)) +
s.substring(1).toLowerCase();
}
public String fullName() { return firstName + " " + lastName; }
}
PersonName name = new PersonName("jOHN", "DOE");
System.out.println(name.fullName()); // John DoePenyalinan Berwaspada
Untuk komponen yang boleh berubah seperti tatasusunan atau koleksi, lakukan salinan berwaspada dalam pembina padat bagi mengekalkan keadaan tidak berubah.
import java.util.*;
record Snapshot(List<String> items) {
Snapshot {
items = List.copyOf(items); // defensive copy — unmodifiable
}
}
List<String> mutable = new ArrayList<>(List.of("a", "b", "c"));
Snapshot snap = new Snapshot(mutable);
mutable.add("d"); // doesn't affect snapshot
System.out.println(snap.items()); // [a, b, c]
try {
snap.items().add("e"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Snapshot is truly immutable!");
}Rekod Range dengan Had
Rekod Range praktikal yang memastikan min <= max serta menyediakan kaedah utiliti yang berguna.
record Range(int min, int max) {
Range {
if (min > max) throw new IllegalArgumentException(
"min (" + min + ") must be <= max (" + max + ")");
}
public boolean contains(int value) { return value >= min && value <= max; }
public int size() { return max - min; }
public int clamp(int value) { return Math.max(min, Math.min(max, value)); }
}
Range valid = new Range(1, 10);
System.out.println(valid.contains(5)); // true
System.out.println(valid.clamp(15)); // 10
System.out.println(valid.size()); // 9Merangkaikan Logik Pembina Padat
Untuk pengesahan yang kompleks, asingkan kaedah pembantu dan panggil kaedah tersebut daripada pembina padat.
record CreditCard(String number, String cvv, int expiryMonth, int expiryYear) {
CreditCard {
validateNumber(number);
validateCvv(cvv);
validateExpiry(expiryMonth, expiryYear);
number = number.replaceAll("[^0-9]", ""); // strip spaces/dashes
}
private static void validateNumber(String n) {
String digits = n.replaceAll("[^0-9]", "");
if (digits.length() < 13 || digits.length() > 19)
throw new IllegalArgumentException("Invalid card number length");
}
private static void validateCvv(String cvv) {
if (!cvv.matches("[0-9]{3,4}"))
throw new IllegalArgumentException("Invalid CVV");
}
private static void validateExpiry(int m, int y) {
if (m < 1 || m > 12) throw new IllegalArgumentException("Invalid month");
if (y < 2024) throw new IllegalArgumentException("Card expired");
}
}Pelbagai Corak Pembina Padat
Corak pengesahan biasa yang digunakan dalam pembina padat.
record Percentage(double value) {
Percentage {
if (value < 0 || value > 100)
throw new IllegalArgumentException(
"Percentage must be 0-100, got: " + value);
value = Math.round(value * 100.0) / 100.0; // round to 2 dp
}
public double asFraction() { return value / 100.0; }
}
Percentage tax = new Percentage(8.756);
System.out.println(tax.value()); // 8.76
System.out.println(tax.asFraction()); // 0.0876Pembina Bukan Kanonik
Rekod boleh mempunyai pembina tambahan, tetapi pembina tersebut mesti menyerahkan tugas kepada pembina kanonik menggunakan this(...).
record Point(double x, double y) {
// Non-canonical constructor: origin point
Point() { this(0.0, 0.0); }
// Non-canonical: polar coordinates
static Point fromPolar(double r, double theta) {
return new Point(r * Math.cos(theta), r * Math.sin(theta));
}
public double distance(Point other) {
double dx = this.x - other.x;
double dy = this.y - other.y;
return Math.sqrt(dx*dx + dy*dy);
}
}
Point origin = new Point();
Point p = Point.fromPolar(5, Math.PI/4);
System.out.printf("Distance: %.2f%n", origin.distance(p)); // 5.00Rekod Koleksi Tidak Berubah
Rekod yang menyimpan gambaran keseluruhan pilihan pengguna yang tidak berubah serta mengesahkan dan menormalkan pilihan tersebut semasa pembinaan.
import java.util.*;
record UserPreferences(String theme, Set<String> enabledFeatures, int fontSize) {
private static final Set<String> VALID_THEMES = Set.of("light", "dark", "system");
private static final Set<String> VALID_FEATURES = Set.of("ai", "beta", "analytics");
UserPreferences {
if (!VALID_THEMES.contains(theme))
throw new IllegalArgumentException("Unknown theme: " + theme);
if (!VALID_FEATURES.containsAll(enabledFeatures))
throw new IllegalArgumentException("Unknown feature in: " + enabledFeatures);
if (fontSize < 10 || fontSize > 24)
throw new IllegalArgumentException("fontSize must be 10-24");
enabledFeatures = Set.copyOf(enabledFeatures); // defensive copy
}
}Batasan Pembina Padat
Perkara yang tidak boleh dilakukan dalam pembina padat:
- Anda tidak boleh memberikan nilai kepada komponen secara jelas (komponen diberikan nilai secara automatik selepas blok selesai)
- Anda tidak boleh memanggil
this()atausuper() - Melemparkan pengecualian menghalang semua komponen daripada diberikan nilai
record Safe(int value) {
Safe {
// CAN: validate and modify component variables
if (value < 0) value = 0; // normalized to 0 if negative
// value = this.value; // NOT NEEDED — assignment happens after block
}
}
System.out.println(new Safe(-5).value()); // 0 (normalized)
System.out.println(new Safe(10).value()); // 10Semakan Pantas
Dalam pembina padat, apakah yang berlaku kepada pengubahsuaian pemboleh ubah komponen yang anda lakukan?
Imbas Kembali: Pembina Padat dan Pengesahan
Perkara penting:
- Pembina padat dijalankan sebelum komponen diberikan nilai — tiada pemberian nilai secara jelas diperlukan
- Gunakannya untuk mengesahkan, menormalkan atau menyalin komponen secara berwaspada
- Ubah suai pemboleh ubah komponen untuk menormalkan nilai (huruf kecil, buang ruang dan salin)
- Lemparkan IllegalArgumentException untuk data tidak sah bagi menguatkuasakan invarian
- Gunakan List.copyOf / Set.copyOf untuk komponen koleksi yang boleh berubah
- Pembina bukan kanonik mesti menyerahkan tugas kepada pembina kanonik dengan this(...)
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Pembina Padat dan Pengesahan” percuma?
Ya — teks penuh “Pembina Padat dan Pengesahan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pembina Padat dan Pengesahan”?
Tambahkan logik pengesahan dalam pembina padat untuk memastikan integriti data. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Pembina Padat dan Pengesahan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengenalan kepada Record
- Pembina Padat dan Pengesahan
- Kaedah Tersuai pada Record
- Record berbanding Kelas berbanding Lombok