Rumah  >  Artikel  >  Java  >  Kelas Tertutup en Java

Kelas Tertutup en Java

Susan Sarandon
Susan Sarandonasal
2024-10-29 01:37:29655semak imbas

Sealed Classes en Java

kelas tertutup ialah ciri yang sebelum ini diperkenalkan dalam JDK 15 dan secara rasmi dalam JDK 17. kelas tertutup ialah kelas yang tidak boleh dilanjutkan oleh kelas yang tidak dibenarkan secara eksplisit (dalam pengisytiharan kelas), jadi bilangan subkelas adalah terhad dan diketahui lebih awal.

Ia bertujuan untuk membenarkan kawalan yang lebih tepat ke atas hierarki warisan, serta memudahkan pemodelan domain di mana semua kemungkinan subkelas diketahui, dan meningkatkan keselamatan dan kebolehselenggaraan kod.

Perbezaan antara kelas tertutup dan kelas jenis akhir ialah kelas terakhir tidak boleh dilanjutkan oleh mana-mana kelas, manakala kelas tertutup boleh dilanjutkan dengan bilangan terhad daripada kelas.

Pengisytiharan kelas tertutup

Andaikan kita mempunyai dua kelas, kelas Shape dan kelas Circle, kedua-duanya adalah kelas biasa, jadi Shape boleh dilanjutkan oleh mana-mana kelas.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Jika kita menggunakan kata kunci akhir dalam kelas Shape, maka ia tidak boleh dilanjutkan oleh mana-mana kelas.

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Sekarang, jika kita mahu kelas Shape dilanjutkan hanya oleh kelas tertentu (contohnya, Bulatan dan Square), maka kita boleh mengisytiharkannya sebagai kelas tertutup.

public sealed class Shape permits Circle, Square {
    // ...
}

Menganalisis pengisytiharan sebelumnya, kami melihat bahawa adalah perlu untuk meletakkan dimeterai sebelum kelas perkataan untuk menunjukkan bahawa ia adalah kelas tertutup. Kemudian, perkataan permit digunakan diikuti dengan senarai kelas yang boleh melanjutkan kelas semasa, dalam contoh di atas, hanya kelas Bulatan dan Square boleh melanjutkan kelas Bentuk.

Perkara yang sama berlaku jika anda bekerja dengan kelas jenis abstrak, iaitu, kelas yang tidak boleh digunakan, tetapi boleh dilanjutkan oleh kelas lain.

public sealed abstract class Shape permits Circle, Square {
    // ...
}

Konsep ini juga boleh digunakan pada antara muka.

public sealed interface Shape permits Circle, Square {
    // ...
}

Nota: Subkelas yang dibenarkan mesti berada dalam modul atau pakej yang sama dengan kelas dimeterai, jika tidak, mesej ralat akan dipaparkan.

Kelas yang dibenarkan

Setelah kelas diisytiharkan dimeterai dan kelas yang dibenarkan telah ditentukan, apabila melanjutkan kelas Shape dengan kelas yang dibenarkan (dengan meletakkan extends Shape) IDE akan memaparkan mesej ralat yang serupa dengan ini Pengubah suai 'dimeterai' , 'tidak dimeterai' atau 'akhir' dijangka, Apakah maksudnya?.

Perlu diambil kira bahawa setiap kelas yang dibenarkan (subkelas) mesti diisytiharkan dengan salah satu daripada kata kunci berikut:

  • akhir: Menunjukkan bahawa kelas tidak boleh dilanjutkan.
  • dimeterai: Menunjukkan bahawa kelas ialah kelas tertutup dan ia telah membenarkan subkelas.
  • tidak dimeterai: Menunjukkan bahawa kelas itu bukan kelas tertutup dan ia boleh dilanjutkan oleh mana-mana kelas.

Untuk mempraktikkan perkara di atas, mari kita bekerjasama dengan kelas Shape dan kelas Bulatan, Square dan Triangle untuk melihat cara kelas yang dibenarkan boleh diisytiharkan mengikut apa yang dinyatakan di atas.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Kelas bulatan - akhir

Jika kita mahu kelas Bulatan menjadi jenis terakhir dan akibatnya tidak boleh dilanjutkan, maka ia mesti diisytiharkan seperti berikut:

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Ini menghalang kelas Bulatan daripada dilanjutkan oleh mana-mana kelas lain.

Kelas persegi - dimeterai

Jika kita mahu kelas Square mempunyai jenis yang dimeterai dan telah membenarkan subkelas yang boleh memanjangkannya, maka ia mesti diisytiharkan seperti berikut:

public sealed class Shape permits Circle, Square {
    // ...
}

Untuk contoh ini, setiap kelas yang dibenarkan (SquareChild1 dan SquareChild2) diisytiharkan sebagai jenis muktamad supaya mereka tidak boleh dilanjutkan oleh mana-mana kelas lain.

public sealed abstract class Shape permits Circle, Square {
    // ...
}

Jika anda mahu kelas ini boleh dilanjutkan oleh lebih banyak kelas, maka kelas itu hendaklah diisytiharkan sebagai dimeterai atau boleh dilanjutkan oleh mana-mana kelas yang tidak dimeterai.

Kelas segi tiga - tidak bertutup

Dalam kes kelas Triangle, apabila ia diisytiharkan tidak dimeterai, ia membenarkan kelas ini dilanjutkan oleh mana-mana kelas lain, tanpa perlu menyatakan kelas yang dibenarkan.

public sealed interface Shape permits Circle, Square {
    // ...
}

Sebagai contoh, jika anda mencipta kelas TriangleChild yang memanjangkan Triangle, tiada mesej ralat akan dipaparkan.

public sealed class Shape permits Circle, Square, Triangle {
    // ...
}

Pada ketika ini adalah penting untuk mempertimbangkan bahawa jika anda mengisytiharkan kelas sebagai tidak dimeterai anda "break" dengan cara tertentu tujuan kelas tertutup, kerana ia membenarkan kelas ini dilanjutkan oleh mana-mana kelas lain dan bilangan subkelas yang dibenarkan tidak terhad.

Bolehkah rekod menjadi kelas tertutup?

Untuk bahagiannya, rekod tidak boleh daripada jenis yang dimeterai kerana ia sudah pun daripada jenis terakhir dan tidak boleh dilanjutkan oleh mana-mana kelas lain. Tetapi apa yang anda boleh lakukan ialah mengisytiharkan rekod seperti yang dibenarkan dalam antara muka jenis tertutup (pertimbangkan bahawa rekod tidak boleh melanjutkan kelas, hanya melaksanakan antara muka). Sebagai contoh, jika anda mempunyai rekod yang dipanggil Rectangle dan antara muka Bentuk jenis dimeterai, anda boleh mengisytiharkan Rectangle seperti yang dibenarkan dalam antara muka Shape dan dengan cara ini Rectangle akan dapat melaksanakan antara muka Shape dan semua kaedah yang mengandungi antara muka ini.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Bagaimana dengan kelas dalaman?

Jika kelas yang diisytiharkan sebagai dimeterai mempunyai kelas dalam (kelas bersarang atau dalam), diandaikan bahawa kelas ini tergolong dalam kelas utama dan, oleh itu, tidak perlu mengisytiharkannya sebagai dibenarkan. Sebagai contoh, jika anda mempunyai kelas Haiwan yang diisytiharkan sebagai dimeterai dan pada masa yang sama ia mempunyai Dog dan Cat sebagai kelas dalaman, kelas ini tidak perlu diisytiharkan sebagai dibenarkan, tetapi mereka mesti melanjutkan kelas utama dan daripada jenis terakhir , dimeterai atau tidak dimeterai .

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Kesimpulan

Kelas tertutup ialah satu cara untuk mengehadkan hierarki kelas kepada bilangan terhingga subkelas yang dibenarkan, walaupun kita telah melihat bahawa jika kelas diisytiharkan tidak dimeterai tujuannya agak hilang atau Dengan mengisytiharkan subkelas sebagai dimeterai anda boleh melanjutkan hierarki ini lebih jauh lagi.

Adalah penting untuk mempertimbangkan bahawa apabila mengisytiharkan kelas sebagai dimeterai ini hanya merujuk kepada siapa yang boleh melanjutkannya, tetapi tidak mengehadkan penciptaan contoh kelas utama, dan ia juga tidak mengubah suai semantik kelas, iaitu, ia tidak mengubah suai gelagat dalaman kelas.

Atas ialah kandungan terperinci Kelas Tertutup en Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn