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

Java 8 untuk Pengembangan Android: Default dan Metode Statis

by
Read Time:11 minsLanguages:
This post is part of a series called Java 8 for Android Development.
Java 8 for Android: Cleaner Code With Lambda Expressions
Java 8 for Android Development: Stream API and Date & Time Libraries

Indonesian (Bahasa Indonesia) translation by Ilham Saputra (you can also view the original English article)

Java 8 adalah kemajuan yang besar untuk bahasa pemrograman dan sekarang, dengan dirilisnya Android Studio 3.0, pengembang Android akhirnya memiliki akses ke dukungan bawaan untuk beberapa fitur terpenting di Java 8.

Dalam seri ketiga bagian ini, kami telah menjelajahi fitur Java 8 yang dapat mulai Anda gunakan di proyek Android Anda hari ini. Dalam Cleaner Code Dengan Lambda Expressions, kami mengatur pengembangan kami untuk menggunakan dukungan Java 8 yang disediakan oleh toolchain bawaan Android, sebelum melihat ekspresi lambda secara mendalam.

Dalam postingan ini, kita akan melihat dua cara berbeda yang dapat Anda deklarasikan metode non-abstrak dalam antarmuka Anda (sesuatu yang tidak mungkin di versi Java sebelumnya). Kami juga akan menjawab pertanyaan, sekarang antarmuka dapat menerapkan metode, apa sebenarnya perbedaan antara kelas dan antarmuka abstrak?

Kami juga akan mencakup fitur Java 8 yang memberi Anda kebebasan untuk menggunakan anotasi yang sama sebanyak yang Anda inginkan di lokasi yang sama, sambil tetap kompatibel dengan versi Android sebelumnya.

Tetapi pertama-tama, mari kita lihat fitur Java 8 yang dirancang untuk digunakan bersama dengan ekspresi lambda yang kita lihat di postingan sebelumnya.

Tulis Cleaner Lambda Expressions, Dengan Referensi Metode

Dalam postingan terakhir, Anda melihat bagaimana Anda dapat menggunakan ekspresi lambda untuk menghapus banyak kode boilerplate dari aplikasi Android Anda. Namun, ketika ekspresi lambda hanya memanggil satu metode yang sudah memiliki nama, Anda dapat memotong lebih banyak kode dari proyek Anda dengan menggunakan referensi metode.

Misalnya, ekspresi lambda ini benar-benar hanya mengalihkan pekerjaan ke metode handleViewClick yang ada:

Dalam skenario ini, kita bisa merujuk ke metode ini dengan nama, menggunakan operator referensi metode ::. Anda membuat referensi metode semacam ini, menggunakan format berikut:

Dalam contoh Tombol Aksi Floating kami, kami dapat menggunakan referensi metode sebagai body ekspresi lambda kami:

Perhatikan bahwa metode yang direferensikan harus mengambil parameter yang sama dengan antarmuka—dalam hal ini, itu adalah View.

Anda dapat menggunakan operator referensi metode (::) untuk referensi salah satu dari yang berikut:

Metode Statis

Jika Anda memiliki ekspresi lambda yang memanggil metode statis:

Kemudian Anda dapat mengubahnya menjadi metode referensi:

Sebagai contoh, jika Anda memiliki metode statis PrintMessage dalam kelas MyClass, maka referensi metode Anda akan terlihat seperti ini:

Contoh Metode Object Khusus

Ini adalah contoh metode dari objek yang dikenal terlebih dahulu, memungkinkan Anda untuk mengganti:

Dengan:

Jadi, jika Anda memiliki ekspresi lambda berikut:

Kemudian memperkenalkan metode referensi akan memberi Anda hal berikut:

Contoh Metode Arbitrary Object Tipe Particular

Ini adalah contoh metode dari arbitrary object yang akan diberikan kemudian, dan ditulis dalam format berikut:

Referensi Konstruktor

Referensi konstruktor mirip dengan referensi metode, kecuali bahwa Anda menggunakan kata kunci new untuk memohon konstruktor. Misalnya, Button::new adalah referensi konstruktor untuk kelas Button, meskipun konstruktor yang tepat yang dijalankan bergantung pada konteksnya.

Menggunakan referensi konstruktor, Anda dapat mengubah:

Ke:

Misalnya, jika Anda memiliki antarmuka MyInterface berikut:

Kemudian Anda dapat menggunakan referensi konstruktor untuk membuat contoh Student baru:

Ini juga memungkinkan untuk membuat referensi konstruktor untuk jenis array. Sebagai contoh, referensi konstruktor untuk array int adalah int[]::new.

Tambahkan Metode Default ke Antarmuka Anda

Sebelum Java 8, Anda hanya bisa menyertakan metode abstrak di antarmuka Anda (yaitu metode tanpa body), yang membuatnya sulit untuk mengembangkan antarmuka, pasca-publikasi.

Setiap kali Anda menambahkan metode ke definisi antarmuka, setiap kelas yang mengimplementasikan antarmuka ini tiba-tiba kehilangan implementasi. Misalnya, jika Anda memiliki antarmuka (MyInterface) yang digunakan oleh MyClass, kemudian menambahkan metode ke MyInterface akan merusak kompatibilitas dengan MyClass.

Dalam skenario terbaik dimana Anda bertanggung jawab untuk sejumlah kecil kelas yang menggunakan MyInterface, perilaku ini akan mengganggu tetapi dapat dikelola—Anda hanya perlu menyisihkan waktu untuk memperbarui kelas Anda dengan penerapan baru. Namun, hal-hal dapat menjadi jauh lebih rumit jika sejumlah besar kelas menerapkan MyInterface, atau jika antarmuka digunakan di kelas yang Anda tidak bertanggung jawab.

Meskipun ada sejumlah solusi untuk masalah ini, tidak ada satupun yang ideal. Sebagai contoh, Anda bisa memasukkan metode baru dalam kelas abstrak, tetapi ini masih membutuhkan semua orang untuk memperbarui kode mereka untuk memperluas kelas abstrak ini; dan, sementara Anda dapat memperluas antarmuka asli dengan antarmuka baru, siapa pun yang ingin menggunakan metode baru ini kemudian perlu menulis ulang semua referensi antarmuka yang ada.

Dengan diperkenalkannya metode default di Java 8, sekarang mungkin untuk mendeklarasikan metode non-abstrak (yaitu metode dengan tubuh) di dalam antarmuka Anda, sehingga Anda akhirnya dapat membuat penerapan default untuk metode Anda.

Ketika Anda menambahkan metode ke antarmuka Anda sebagai metode default, setiap kelas yang mengimplementasikan antarmuka ini tidak perlu menyediakan penerapannya sendiri, yang memberi Anda cara memperbarui antarmuka Anda tanpa merusak kompatibilitas. Jika Anda menambahkan metode baru ke antarmuka sebagai metode default, maka setiap kelas yang menggunakan antarmuka ini tetapi tidak memberikan penerapannya sendiri hanya akan mewarisi penerapan metode default. Karena kelas tidak kehilangan penerapan, itu akan terus berfungsi seperti biasa.

Bahkan, pengenalan metode default adalah alasan bahwa Oracle mampu membuat sejumlah besar tambahan ke Collections API di Java 8.

Collection adalah antarmuka umum yang digunakan di banyak kelas berbeda, jadi menambahkan metode baru ke antarmuka ini memiliki potensi untuk memecah baris kode yang tak terhitung jumlahnya. Daripada menambahkan metode baru ke antarmuka Collection dan memecah setiap kelas yang diturunkan dari antarmuka ini, Oracle membuat fitur metode default, dan kemudian menambahkan metode baru ini sebagai metode default. Jika Anda melihat metode Collection.Stream() yang baru (yang akan kita jelajahi secara detail di bagian ketiga), Anda akan melihat bahwa itu ditambahkan sebagai metode default:

Membuat metode default sederhana—tambahkan saja pengubah default ke metode signature Anda:

Sekarang, jika MyClass menggunakan MyInterface tetapi tidak memberikan implementasi defaultMethod sendiri, itu hanya akan mewarisi penerapan default yang disediakan oleh MyInterface. Misalnya, kelas berikut masih akan dikompilasi:

Kelas implementasi dapat menggantikan implementasi default yang disediakan oleh antarmuka, sehingga kelas masih dalam kendali penuh atas implementasinya.

Meskipun metode default adalah tambahan yang diterima untuk desainer API, mereka terkadang dapat menyebabkan masalah bagi pengembang yang mencoba menggunakan beberapa antarmuka di kelas yang sama.

Bayangkan bahwa selain MyInterface, Anda memiliki yang berikut:

Baik MyInterface dan SecondInterface berisi metode default dengan signature yang sama (defaultMethod). Sekarang bayangkan Anda mencoba menggunakan kedua antarmuka ini di kelas yang sama:

Pada titik ini Anda memiliki dua implementasi bertentangan defaultMethod, dan kompilator tidak tahu metode yang digunakan, sehingga Anda akan menemukan sebuah kesalahan kompilator.

Salah satu cara untuk mengatasi masalah ini adalah mengganti metode yang bertentangan dengan implementasi Anda sendiri:

Solusi lainnya adalah menentukan versi defaultMethod mana yang ingin Anda terapkan, menggunakan format berikut:

Jadi jika kamu ingin memanggil implementasi MyInterface#defaultMethod(), maka Anda akan menggunakan berikut:

Menggunakan Metode Statis di Antarmuka Java 8 Anda

Serupa dengan metode default, metode antarmuka statis memberi Anda cara mendefinisikan metode di dalam antarmuka. Namun, tidak seperti metode default, kelas implementasi tidak dapat menggantikan metode statis antarmuka.

Jika Anda memiliki metode statis yang khusus untuk antarmuka, maka metode antarmuka statis Java 8 memberi Anda cara menempatkan metode ini di dalam antarmuka yang sesuai, daripada harus menyimpannya di kelas yang terpisah.

Anda membuat metode statis dengan menempatkan kata kunci static di awal tanda tangan metode, misalnya:

Saat Anda mengimplementasikan antarmuka yang berisi metode antarmuka statis, metode statis tersebut masih menjadi bagian dari antarmuka dan tidak diwariskan oleh kelas yang menerapkannya, jadi Anda harus mengawali metode dengan nama antarmuka, misalnya:

Ini juga berarti bahwa kelas dan antarmuka dapat memiliki metode statis dengan tanda tangan yang sama. Misalnya, menggunakan MyClass.staticMethod dan MyInterface.staticMethod di kelas yang sama tidak akan menyebabkan kesalahan waktu kompilasi.

Jadi, Apakah Antarmuka Intinya Hanya Kelas Abstrak?

Penambahan metode antarmuka statis dan metode default telah menyebabkan beberapa pengembang mempertanyakan apakah antarmuka Java menjadi lebih seperti kelas abstrak. Namun, bahkan dengan penambahan metode antarmuka default dan statis, masih ada beberapa perbedaan penting antara antarmuka dan kelas abstrak:

  • Kelas abstrak dapat memiliki variabel final, non-final, statis dan non-statis, sedangkan antarmuka hanya dapat memiliki variabel statis dan final.
  • Kelas abstrak memungkinkan Anda untuk menyatakan bidang yang tidak statis dan final, sedangkan bidang antarmuka pada dasarnya bersifat statis dan final.
  • Dalam antarmuka, semua metode yang Anda nyatakan atau definisikan sebagai metode default bersifat umum, sedangkan dalam kelas abstrak Anda dapat menentukan metode konkret publik, terlindungi, dan pribadi.
  • Kelas abstrak adalah kelas, dan karena itu dapat memiliki state; antarmuka tidak dapat memiliki status yang terkait dengannya.
  • Anda bisa mendefinisikan konstruktor di dalam kelas abstrak, sesuatu yang tidak mungkin dalam antarmuka Jawa.
  • Java hanya memungkinkan Anda untuk memperluas satu kelas (terlepas dari apakah itu abstrak), tetapi Anda bebas untuk mengimplementasikan sebanyak antarmuka yang Anda butuhkan. Ini berarti bahwa antarmuka biasanya memiliki tepi ketika Anda memerlukan banyak warisan, meskipun Anda perlu berhati-hati terhadap berlian mematikan yang mematikan!

Terapkan Anotasi yang Sama dengan Banyak Kali yang Anda Inginkan

Secara tradisional, salah satu batasan anotasi Java adalah Anda tidak dapat menerapkan anotasi yang sama lebih dari satu kali di lokasi yang sama. Coba gunakan anotasi yang sama beberapa kali, dan Anda akan mengalami kesalahan waktu kompilasi.

Namun, dengan pengenalan Jawa 8 berulang anotasi, kau sekarang bebas untuk menggunakan anotasi sama sebanyak yang Anda inginkan di lokasi yang sama.

Untuk memastikan kode Anda tetap kompatibel dengan versi Java sebelumnya, Anda harus menyimpan anotasi berulang dalam anotasi container.

Anda dapat memberi tahu compiler untuk membuat container ini, dengan menyelesaikan langkah-langkah berikut:

  • Tandai anotasi yang dimaksud dengan @Repeatable meta-annotation (anotasi yang digunakan untuk menganotasi anotasi). Misalnya, jika Anda ingin menjadikan anotasi @ToDo dapat diulang, Anda akan menggunakan: @Repeatable(ToDos.class). Nilai dalam tanda kurung adalah jenis anotasi kontainer yang nantinya akan dihasilkan oleh kompilator.
  • Deklarasikan tipe anotasi yang mengandung. Ini harus memiliki atribut yang merupakan array dari jenis anotasi berulang, misalnya:

Mencoba menerapkan anotasi yang sama beberapa kali tanpa terlebih dahulu menyatakan bahwa pengulangannya akan menghasilkan kesalahan pada waktu kompilasi. Namun, setelah Anda menetapkan bahwa ini adalah anotasi berulang, Anda dapat menggunakan anotasi ini beberapa kali di lokasi mana pun Anda menggunakan anotasi standar.

Kesimpulan

Di bagian kedua dari seri kami di Java 8, kami melihat bagaimana Anda dapat memotong kode boilerplate lebih dari proyek Android Anda dengan menggabungkan ekspresi lambda dengan referensi metode, dan bagaimana meningkatkan antarmuka Anda dengan metode default dan statis.

Pada tahap ketiga dan terakhir, kami akan melihat Java 8 API baru yang memungkinkan Anda memproses data dalam jumlah besar dengan cara deklaratif yang lebih efisien, tanpa harus khawatir tentang konkurensi dan pengelolaan thread. Kami juga akan menggabungkan beberapa fitur berbeda yang telah kami bahas di seluruh seri ini, dengan menjelajahi peran yang harus dimainkan Antarmuka Fungsional dalam ekspresi lambda, metode antarmuka statis, metode default, dan banyak lagi.

Dan akhirnya, meskipun kami masih menunggu API Tanggal dan Waktu baru Java 8 untuk secara resmi tiba di Android, saya akan menunjukkan bagaimana Anda dapat mulai menggunakan API baru ini di proyek Android Anda hari ini, dengan bantuan beberapa pihak ketiga library.

Sementara itu, periksa beberapa postingan kami yang lain tentang pengembangan aplikasi Java dan Android!

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.