Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Kotlin

Kotlin Dari Gores: Kelas dan Objek

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Advanced Functions
Kotlin From Scratch: Advanced Properties and Classes

Malay (Melayu) translation by Muhammad Hasan (you can also view the original English article)

Bahasa pengaturcaraan moden yang dikompilasi dengan bytecode Java. Ia adalah sumber yang bebas dan terbuka, dan berjanji untuk membuat pengekodan untuk Android lebih menyeronokkan.

Dalam artikel sebelumnya, anda mempelajari penggunaan fungsi lanjutan, seperti fungsi lanjutan, penutupan, fungsi pesanan tinggi, dan fungsi sebaris di Kotlin.

Dalam pembelajaran tentang kelas: belajar tentang kelas: pembina dan sifat, pemutus, dan ciri kelas yang lebih maju yang Kotlin memudahkan.

1. Kelas

Kelas adalah satu program yang menggabungkan unit-unit fungsi dan data untuk melaksanakan beberapa tugas yang berkaitan. Kami mengisytiharkan kelas di Kotlin menggunakan kata kunci kelas - sama dengan Java.

Kod sebelumnya adalah perisytiharan kelas yang paling mudah - kami hanya mencipta kelas kosong yang disebut Book. Kami masih boleh memberi contoh kelas ini walaupun ia tidak mengandungi badan menggunakan pembina lalai.

Memandangkan anda boleh mematuhi kod di atas, kami tidak menggunakan kata kunci baru untuk memberi contoh kepada kelas ini seperti biasa dalam bahasa pengaturcaraan lain. baru bukan kata kunci dalam Kotlin. Ini menjadikan kod sumber kami ringkas ketika membuat contoh kelas. Tetapi sedar bahawa instansiasi kelas Kotlin di Jawa akan memerlukan kata kunci baru.

Kelas Pembina dan Hartanah

Mari kita lihat bagaimana untuk menambah pembina dan sifat ke kelas kami. Tetapi pertama, mari kita lihat kelas biasa di Jawa:

Melihat kelas model Buku kami di atas, kami mempunyai perkara berikut:

  • dua bidang: tajuk dan isbn
  • pembina tunggal
  • getters dan setter untuk kedua-dua bidang (nasib baik, boleh membantu anda menjana kaedah ini)

Sekarang mari kita lihat bagaimana kita boleh menulis kod sebelumnya di Kotlin sebagai gantinya:

Kelas cantik! Kami telah mengurangkan jumlah kod dari 20 hingga 9 sahaja. Fungsi pembina () ini dipanggil pembina sekunder di Kotlin. Pembina ini bersamaan dengan pembina Java yang kami panggil ketika menamakan kelas.

Di Kotlin, tidak ada konsep bidang seperti yang anda ketahui; Sebaliknya, ia menggunakan konsep "sifat". Sebagai contoh, kami mempunyai dua sifat kata kunci yang boleh dimaklumkan (baca-tulis) yang diisytiharkan dengan var: tajuk dan isbn dalam kelas Buku. (Jika anda memerlukan penyemak semula pada pembolehubah di Kotlin, sila lawati jawatan pertama dalam siri ini: Pembolehubah, Jenis Asas dan Array).

Ciri-ciri dan penentu yang menakjubkan untuk sifat-sifat ini dijana secara automatik untuk kita di bawah hud oleh pengkompil Kotlin. Perhatikan bahawa ia tidak menentukan pengubah penglihatan apa-apa kepada sifat-sifat ini - jadi secara lalai, mereka umum. Dengan kata lain, mereka boleh diakses dari mana-mana sahaja.

Mari kita lihat versi lain dari kelas yang sama Kotlin:

Dalam kod ini, kami mengeluarkan pembina sekunder. Sebaliknya, kami mengisytiharkan pembina dalam tajuk kelas dipanggil pembina utama. Primary constructor tidak mempunyai sebarang tempat untuk meletakkan blok kod, jadi kami menggunakan modifier init untuk memulakan parameter masuk dari pembina utama. Ambil perhatian bahawa blok kod init dilaksanakan segera apabila contoh kelas dibuat.

Seperti yang anda lihat, kod kami masih mempunyai banyak boilerplate. Mari kita teruskan lagi:

Kelas Buku kami kini hanya satu baris kod. Itu sangat keren! Perhatikan bahawa dalam senarai parameter pembina utama, kami menentukan sifat-sifat mutable kami: tajuk dan isbn langsung di dalam pembina utama dengan kata kunci var.

Kita juga boleh menambah sebarang nilai lalai untuk sifat-sifat kelas di dalam pembina.

Sebenarnya, kita juga boleh meninggalkan kata kunci pembina, tetapi ia tidak mempunyai pengubah penglihatan (awam, swasta, atau dilindungi) atau sebarang anotasi.

Kelas yang sangat kemas, saya mesti katakan!

Kita kini boleh membuat contoh kelas seperti ini:

Mengakses dan Menetapkan Hartanah

Di Kotlin, kita boleh mendapatkan harta oleh buku objek kelas, diikuti oleh pemisah dot, maka tajuk nama harta. Gaya ringkas untuk mengakses hartanah disebut syntax akses hartanah. Dalam erti kata lain, kita tidak perlu memanggil kaedah getter hartanah untuk akses atau memanggil setter untuk menetapkan harta di Kotlin - seperti yang kita lakukan di Jawa.

Kerana harta diisytiharkan sebagai tulis-baca, kita juga boleh menukar nilai harta menggunakan operator tugasan =.

Mari lihat contoh lain:

Di sini, kita memperbaharui parameter isbn untuk menjadi tidak berubah (baca sahaja) sebaliknya - dengan menggunakan kata kunci val. Kami menyampaikan contoh kelas buku itu dan menugaskan hak milik harta nilai "Things Fall Apart". Perhatikan bahawa apabila kita cuba untuk menetapkan semula nilai harta isbn kepada 1234, pengadu akan dikeluhkan. Harta ini tidak berubah, telah ditakrifkan dengan kata kunci val.

Interoperability Java

Perhatikan bahawa dengan mengisytiharkan parameter dengan pengubah var di dalam pembina utama, pengkompil Kotlin (di belakang tabir) mempunyai aksesori harta: getters dan setters. Sekiranya anda menggunakan val, ia akan menghasilkan hanya pemeroleh.

Ini bermakna bahawa pemanggil Java hanya boleh mendapatkan medan hartanah dengan memanggil kaedah atau kaedah penapis masing-masing. Ingat, ini bergantung kepada pengubah yang digunakan untuk menentukan harta Kotlin: var atau val.

Getters Custom dan Setters

Dalam bahagian ini, saya akan menunjukkan kepada anda bagaimana aksesori peribadi dan penyetempatan untuk hartanah di Kotlin jika anda mahu. Mewujudkan setter tersuai boleh berguna sekiranya anda mahu mengesahkan atau mengesahkan sebelum ia ditetapkan kepada harta kelas. Dan pengubah harta tersuai boleh menjadi berguna apabila anda mahu menukar atau mengubah suai nilai yang harus anda kembali.

Membuat Setter Kustom

Kerana kita mahu membuat harta kita sendiri untuk sesuatu harta, kita harus menentukan harta itu di dalam badan kelas dan bukannya pengetua pembina.

Inilah sebabnya mengapa kami mengalihkan harta hakmilik (baca-menulis) yang berubah-ubah ke dalam badan kelas dan nilai lalai (atau tidak akan dikompil).

Anda dapat melihat setter kaedah kami menetapkan (nilai) Anda tidak boleh mengubah suai set () kaedah tanda tangan ini kerana ini adalah apa yang compiler menjangka sebagai fungsi setter property custom.

Nilai parameter diteruskan ke kaedah set Nilai sebenarnya yang diberikan kepada harta oleh pengguna - anda boleh menukar nama parameter jika anda mahu, tetapi nilai lebih disukai. Kami mengesahkan nilai dengan memeriksa jika nilai kosong. Jika kosong, hentikan pelaksanaan dan buang pengecualian; sebaliknya, menetapkan semula nilai kepada pemboleh ubah medan khas.

Bidang pembolehubah bidang khusus ini di dalam kaedah set ialah alias untuk bidang sokongan harta - bidang sokongan. Ini hanya bidang yang digunakan oleh sifat apabila anda ingin mengubah suai atau menggunakan data medan tersebut. Tidak seperti nilai, anda tidak boleh menamakan semula pembolehubah bidang khas ini.

Membuat Custom Getter

Sangat mudah untuk membuat pengubah adat untuk sebuah hartanah di Kotlin.

Di dalam kaedah mendapatkan, kami hanya memulangkan medan diubahsuai - dalam kes kami, kami memulangkan tajuk buku dalam huruf besar.

Perhatikan bahawa setiap kali kita menetapkan nilai untuk tajuk harta, kaedah blok ditetapkannya dilaksanakan - perkara yang sama berlaku untuk kaedah mendapatkan setiap kali kita mengambilnya.

Sekiranya anda ingin belajar tentang fungsi ahli untuk kelas Kotlin (fungsi yang ditakrifkan dalam kelas, objek, atau antara muka), lawati siaran Lebih Fun Dengan Fungsi dalam siri ini.

Lebih banyak pada Constructors

Seperti yang telah dibincangkan sebelumnya, kami mempunyai dua jenis pembina di Kotlin: primer dan sekunder. Kami mempunyai kebebasan untuk menggabungkan kedua-dua mereka dalam satu kelas yang anda dapat lihat dalam contoh di bawah:

Perhatikan bahawa kita tidak boleh mengisytiharkan sifat di dalam pembina sekunder, seperti yang kita lakukan untuk pembina utama. Jika kita mahu melakukan ini, kita perlu mengisytiharkannya dalam kelas badan dan kemudian memulakannya dalam pembina sekunder.

Dalam kod di atas, kami menetapkan nilai lalai bagi harta baru untuk kereta Kelas (ingat, baru bukan kata kunci dalam Kotlin) -kita boleh menggunakan pembina menengah untuk mengubahnya jika kita mahu. Di Kotlin, setiap pembina sekunder mesti memanggil pembina utama, atau memanggil pembina sekunder lain yang memanggil pembina utama-kami menggunakan kata kunci ini untuk mencapai itu.

Perhatikan juga bahawa kita boleh mempunyai beberapa pembangun sekunder dalam kelas.

Jika kelas memanjangkan superclass, maka kita boleh menggunakan kata kunci super (mirip dengan Java) untuk memanggil pembangun superclass (kami akan membincangkan warisan di Kotlin dalam pos masa depan).

Sebagaimana yang saya katakan sebelum ini, bagi kita secara jelas memasukkan pengubah jarak penglihatan kepada pembina di dalam kelas, kita mesti memasukkan kata kunci pembina-secara lalai, pembina adalah awam.

Di sini, kami membuat pembina peribadi-ini bermakna pengguna tidak boleh membuat instantiate objek dengan menggunakan pembinanya secara langsung. Ini berguna jika anda mahu pengguna sebaliknya memanggil kaedah lain (kaedah kilang) untuk melakukan penciptaan objek secara tidak langsung.

2. Mana-mana dan Tiada Jenis

Di Kotlin, jenis teratas dalam hirarki jenis dipanggil Mana-mana. Ini bersamaan dengan jenis Java Object. Ini bermakna semua kelas di Kotlin secara jelas mewarisi dari mana-mana jenis, termasuk String, Int, Double, dan sebagainya. Jenis Mana-mana mengandungi tiga kaedah: sama, toString, dan hashcode.

Kita juga boleh menggunakan kelas Tiada dalam fungsi yang selalu mengembalikan pengecualian dalam kata lain, untuk fungsi yang tidak ditamatkan secara normal. Apabila fungsi kembali Tiada apa-apa, maka kita tahu ia akan membuang pengecualian. Tiada jenis yang sama jenis ini wujud di Jawa.

Ini boleh digunakan apabila ujian pengendalian kesilapan dalam ujian unit anda.

3. Pengubah Kebolehlihatan

Pengubahsuaian penglihatan membantu kami untuk menyekat akses API kami kepada orang ramai. Kami boleh menyediakan pengubah penglihatan yang berbeza kepada kelas, antara muka, objek, kaedah, atau sifat kami. Kotlin menyediakan kami dengan empat pengubah penglihatan:

Awam

Ini adalah lalai, dan mana-mana kelas, fungsi, harta, antara muka, atau objek yang mempunyai pengubah ini boleh diakses dari mana-mana sahaja.

Peribadi

Fungsi, antaramuka atau kelas atas yang diisytiharkan sebagai peribadi boleh diakses hanya dalam fail yang sama.

Mana-mana fungsi atau harta yang diisytiharkan secara peribadi di dalam kelas, objek, atau antara muka hanya dapat dilihat oleh ahli lain dari kelas, objek, atau antara muka yang sama.

Dilindungi

The protected modifier can only be applied to properties or functions inside a class, object, or interface—it can't be applied to top-level functions, classes, or interfaces. Properties or functions with this modifier are only accessible within the class defining it and any subclass.

Dalaman

Dalam satu projek yang mempunyai modul (modul Gradle atau Maven), kelas, objek, antara muka atau fungsi yang dinyatakan dengan pengubah suai dalaman dinyatakan di dalam modul itu hanya boleh diakses dari dalam modul itu.

4. Casting Pintar

Casting bermakna mengambil objek jenis lain dan mengubahnya menjadi jenis objek lain. Sebagai contoh, di Java, kami menggunakan instanceof operator untuk menentukan sama ada ia adalah jenis lain sebelum kami kemudian membuangnya.

Seperti yang anda dapat lihat, kami menyemak sama ada contoh bentuk Circle, dan kemudian kami perlu membuang sebutan secara jelas kepada jenis Bulatan supaya kami dapat memanggil kaedah jenis bulatan.

Satu lagi perkara yang menggerunkan tentang Kotlin adalah kepintaran pengkompilnya ketika datang ke pemutus. Mari kita lihat versi di Kotlin.

Pretty neat! Pengkompil adalah bijak untuk mengetahui bahawa jika blok akan dilaksanakan hanya jika objek bentuk adalah contoh Circle - jadi mekanisme pengecilan dilakukan di bawah tudung untuk kami. Kita sekarang boleh dengan mudah memanggil ciri atau fungsi jenis Circle di dalam blok jika.

Di sini, keadaan terakhir selepas && di tajuk akan dipanggil keadaan pertama adalah benar. Jika bentuknya tidak Circle, maka keadaan terakhir tidak akan dinilai.

5. Casting yang jelas

Kita boleh menggunakan operator sebagai pengendali (atau pengendali yang tidak selamat) untuk memberikan rujukan kepada jenis kepada jenis lain di Kotlin.

Sekiranya operasi pengecualian adalah tidak sah, perhatikan bahawa ClassCastException akan dibuang. Untuk mengelakkan pengecualian daripada dibuang ketika pemutus, kita boleh menggunakan pengendali pemutus yang selamat (atau operator pelakon yang tidak dapat dilupakan) sebagai.

Yang? pengendali akan cuba untuk menghantar ke jenis yang dimaksudkan, dan ia mengembalikan batal jika nilai itu tidak boleh dilemparkan daripada membuang pengecualian. Ingatlah bahawa mekanisme yang sama telah dibincangkan dalam bahagian Nullability dalam pos Nullability, Loops, and Conditions dalam siri ini. Baca di sana untuk penyegaran.

6. Objek

Objek di Kotlin lebih mirip dengan objek JavaScript daripada objek Java. Perhatikan bahawa objek di Kotlin bukanlah contoh kelas tertentu!

Objek sangat serupa dengan kelas. Berikut adalah beberapa ciri objek di Kotlin:

  • Mereka boleh mempunyai sifat, kaedah, dan blok haba.
  • Ciri-ciri ini boleh mempunyai pengubah penglihatan.
  • Mereka tidak boleh mempunyai pembina (utama atau menengah).
  • Mereka boleh melanjutkan kelas-kelas lain atau melaksanakan antara muka.

Sekarang mari kita pergi ke cara untuk membuat objek.

Kami meletakkan objek sebelum nama objek yang kita mahu buat. Sebenarnya, kita membuat satu persatu apabila kita membuat objek di Kotlin menggunakan objek membina, kerana hanya satu contoh objek wujud. Anda belajar lebih lanjut mengenai ini apabila kita membincangkan kesepakatan objek dengan Java.

Singleton adalah corak reka bentuk perisian yang dijamin akan disediakan oleh kelas itu. Sebarang masa pelbagai kelas atau klien meminta kelas, mereka mendapat contoh yang sama kelas. Anda boleh menyemak post saya mengenai pola tunggal di Jawa untuk mengetahui lebih lanjut mengenainya.

Anda boleh mengakses objek atau tunggal di mana sahaja dalam projek anda - selagi anda mengimport pakejnya.

Sekiranya anda seorang coder Java, inilah cara kami biasanya membuat satu persatu:

Seperti yang dapat anda lihat, dengan menggunakan objek Kotlin membina menjadikannya mudah dan membuat perseorangan mudah.

Objek di Kotlin boleh digunakan juga untuk membuat pemalar. Biasanya di Jawa, kami membuat kelas dengan menjadikannya medan akhir statik awam seperti ini:

Ini boleh ditukar kepada Kotlin, lebih ringkas seperti ini:

Di sini kami mengumumkan PERMOHONAN yang berterusan dengan hartanah hartanah di dalam pakej com.chike.kotlin.constants. Di bawah tudung, pangkalan anggota peribadi statik terakhir Java dibuat untuk kami dan diinisialisasi dengan URL rentetan.

Untuk menggunakan pemalar ini dalam pakej Kotlin yang lain, hanya mengimport pakej tersebut.

Interoperability Java

Kotlin menukar objek ke kelas Jawa terakhir di bawah tudung. Kelas ini mempunyai medan statik peribadi yang memegang satu contoh (singleton) kelas. Kod berikut menunjukkan bagaimana pengguna mudah boleh memanggil objek Kotlin dari Java.

Di sini, kelas Java yang dipanggil Singleton dihasilkan dengan INSTANCE ahli akhir statik awam, termasuk fungsi akhir awam myFunc ().

Untuk menjadikan fungsi objek atau harta di Kotlin sebagai ahli statik kelas Java yang dihasilkan, kami menggunakan anotasi @JvmStatic. Inilah cara untuk menggunakannya:

Dengan menggunakan anotasi @JvmStatic ke myFunc (), pengkompil telah menjadikannya fungsi statik.

Sekarang pemanggil Java boleh memanggilnya seperti panggilan ahli statik biasa. Ambil perhatian bahawa menggunakan medan statik INSTANCE untuk memanggil ahli akan tetap berfungsi

7. Objek Pengiring

Sekarang kita dapat memahami apa objek di Kotlin, mari kita menyelam ke objek lain yang dipanggil objek pendamping.

Kerana Kotlin tidak menyokong kelas statik, kaedah ini disediakan oleh kami, dengan alternatif yang lebih berkuasa dipanggil objek pendamping. Objek sah pada dasarnya merupakan objek yang dimiliki oleh kelas - kelas ini dikenali sebagai kelas pendamping objek tersebut. Ini juga bermakna bahawa ciri-ciri yang saya nyatakan untuk objek juga digunakan untuk objek pendamping.

Mewujudkan Objek Pengantara

Sama dengan kaedah statik di Jawa, objek rakan tidak dikaitkan dengan kelas melainkan dengan kelas itu sendiri - sebagai contoh, kaedah statik kilang, yang mempunyai tugas mencipta contoh kelas.

Di sini, kami membuat pembina peribadi - ini bermakna pengguna tidak boleh membuat contoh langsung. Di dalam objek blok sahabat kami, kami mempunyai fungsi membuat (), yang mewujudkan objek Orang dan mengembalikannya.

Melibatkan Fungsi Objek Pengiring

instantiation objek pendamping malas. Dalam erti kata lain, ia akan instantiated hanya apabila diperlukan buat kali pertama. Instantiasi objek sahabat berlaku apabila suatu contoh dari kelas pendamping dicipta atau ahli objek pendamping diakses.

Mari lihat cara untuk menggunakan fungsi objek rakan di Kotlin.

Seperti yang anda dapat lihat, ini sama seperti menggunakan kaedah statik di Java seperti biasa. Dengan kata lain, kita hanya memanggil kelas dan kemudian memanggil ahli. Perhatikan bahawa selain daripada fungsi, kita juga boleh mempunyai sifat di dalam objek sahabat kita.

Perhatikan juga bahawa kelas pendamping mempunyai akses tanpa had ke semua sifat dan fungsi yang diisytiharkan di objek rakannya, sedangkan objek pendamping tidak dapat mengakses ahli kelas. Kita boleh mempunyai blok kod init di dalam objek sahabat-ini dipanggil dengan serta-merta apabila objek pendamping dibuat.

Hasil pelaksanaan kod di atas adalah:

Ingat, hanya satu contoh objek sahabat kelas yang boleh wujud.

Kami juga bebas untuk memberikan objek rakan kami dengan nama.

Di sini, kami memberikan nama yang dipanggil Kilang. Kita boleh memanggilnya seperti ini di Kotlin:

Gaya ini lebih terperinci, jadi melekat dengan cara terdahulu lebih disukai. Tetapi ini mungkin berguna ketika memanggil fungsi objek sahabat atau harta dari Jawa.

Sebagaimana yang saya katakan sebelumnya, seperti objek, objek rakan dapat juga termasuk sifat, fungsi, melaksanakan antara muka, dan bahkan memanjangkan kelas.

Di sini, kami mempunyai antara muka untuk fungsi ciptaan tunggal (). Melihat objek rakan kami yang diubah suai, kini antara muka ini dilaksanakan (anda akan belajar tentang antara muka dan warisan dalam jawatan yang kemudian).

Interoperability Java

Di bawah tudung, objek pengiring disusun sama seperti cara objek Kotlin disusun. Dalam kes kita sendiri, dua kelas dijana untuk kita: kelas Orang akhir dan kelas Akhir peribadi statik Orang $ Companion.

Kelas Orang mengandungi ahli statik akhir bernama Companion - medan statik ini adalah objek kelas dalaman $ Companion Orang. Kelas dalaman $ Companion Orang juga mempunyai ahli sendiri, dan salah satunya adalah fungsi akhir awam yang dipanggil membuat ().

Perhatikan bahawa kami tidak memberikan objek rakan kami nama, jadi ia menghasilkan kelas dalaman yang statik ialah Companion. Jika kami telah memberikan nama, maka nama itu akan menjadi nama yang kami berikan di Kotlin.

Di sini, objek pendamping di Kotlin tidak mempunyai nama, jadi kami menggunakan nama Companion yang disediakan oleh compiler untuk pemanggil Java untuk memanggilnya.

Anotasi @JvmStatic yang digunakan untuk objek rakan kerja yang serupa dengannya berfungsi untuk objek biasa.

Pelanjutan Objek Peserta

Kita juga boleh memanjangkan fungsi objek sahabat. (Jika anda ingin penyegar pada fungsi lanjutan di Kotlin, lawati Tutorial Lanjutan Fungsi dalam siri ini).

Di sini, kami menamakan extFunc () fungsi lanjutan pada objek Companion ClassA.Companion. Dengan kata lain, extfunc () adalah lanjutan objek sahabat. Kemudian kita boleh memanggil sambungan jika ia merupakan fungsi ahli (bukan!) Daripada objek rakan.

Di belakang tabir, pengkompil akan membuat fungsi kegunaan statik extFunc (). Objek penerima sebagai hujah kepada fungsi utiliti ini ialah ClassA $ Companion.

Kesimpulannya

Dalam tutorial ini, anda belajar tentang kelas asas dan objek di Kotlin. Kami membincangkan perkara berikut mengenai kelas:

  • penciptaan kelas
  • pembina
  • hartanah
  • pengubah penglihatan
  • pemutus pintar
  • pemutus eksplisit

Juga, anda belajar tentang bagaimana objek dan objek rakan di Kotlin dengan mudah boleh menggantikan kaedah statik anda, pemalar, dan yang anda kodkan dalam Java. Tetapi itu bukan semua! Terdapat lebih banyak lagi untuk belajar mengenai kelas di Kotlin. Di dalam jawatan yang seterusnya, saya akan menunjukkan kepada anda ciri-ciri yang lebih kerap bahawa Kotlin mempunyai pengaturcaraan berorientasikan objek. Lihat awak tidak lama lagi!

Untuk mengetahui lebih lanjut mengenai bahasa Kotlin, saya cadangkan melawat dokumentasi Kotlin. Atau lihat beberapa jawatan pembangunan aplikasi Android yang lain di sini di Envato Tuts +!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.