Tujuan dari kursus ini adalah untuk membantu Anda menggunakan Java secara lebih efektif. Ada beberapa topik canggih yang dibahas, termasuk pembuatan objek, konkurensi, serialisasi, refleksi, dan fitur canggih lainnya. Kursus ini akan memandu perjalanan Anda dengan kemahiran Java.
1. Pendahuluan
Dalam peringkat bahasa pemrograman Tiobe, bahasa Java yang dikembangkan oleh Sun pada tahun 1995 adalah salah satu bahasa pemrograman yang paling banyak digunakan di dunia. Sebagai bahasa pemrograman umum, bahasa Java sangat menarik bagi insinyur pengembangan perangkat lunak karena toolkit dan lingkungan runtime yang kuat, sintaksis sederhana, dukungan platform yang kaya (ditulis sekaligus, dijalankan di mana -mana) dan dukungan komunitas yang sangat aktif.
Dalam serangkaian artikel ini, konten lanjutan yang terkait dengan Java tercakup, sehingga diasumsikan bahwa pembaca sudah memiliki pengetahuan bahasa dasar. Ini bukan manual referensi lengkap, tetapi panduan lengkap untuk membawa keterampilan Anda ke tingkat berikutnya.
Kursus ini berisi sejumlah besar cuplikan kode. Untuk membuat perbandingan, beberapa pihak lain akan memberikan contoh Java 7 dan Java 8 secara bersamaan.
2. Contoh Konstruksi
Sebagai bahasa yang berorientasi objek, pembuatan objek mungkin merupakan salah satu konsep terpenting dalam bahasa Java. Konstruktor memainkan peran penting dalam inisialisasi instance objek, dan Java menyediakan berbagai cara untuk mendefinisikan konstruktor.
2.1 Metode konstruksi implisit (dihasilkan)
Java tidak memungkinkan konstruktor untuk dinyatakan ketika mendefinisikan kelas, dan ini tidak berarti bahwa tidak ada konstruktor. Mari kita lihat definisi kelas berikut:
Paket com.javacodegeeks.advanced.construction; Noconstructor kelas publik {}Kelas ini tidak mendefinisikan konstruktor, tetapi kompiler Java secara implisit akan menghasilkan satu untuk itu, memungkinkan kita untuk menggunakan kata kunci baru untuk membuat instance objek baru.
noconstructor final noconstructorinstance = noconstructor baru ();
2.2 Metode Konstruksi Tanpa Parameter
Konstruktor tanpa parameter adalah cara termudah untuk mengganti kompilasi Java dan menghasilkan konstruktor dengan deklarasi eksplisit.
Paket com.javacodegeeks.advanced.construction; kelas publik noargConstructor {noargConstructor publik () {// badan konstruktor di sini}}Saat membuat instance objek baru menggunakan kata kunci baru, konstruktor di atas akan dipanggil.
2.3 Metode konstruksi seperti parameter
Metode konstruksi parameter adalah yang paling menarik dan banyak digunakan, dan pembuatan instance baru disesuaikan dengan menentukan parameter. Contoh berikut mendefinisikan konstruktor dengan dua parameter.
Paket com.javacodegeeks.Advanced.construction; Public Class ConstructorWithArguments {public constructorWithArguments (string final arg1, string final arg2) {// badan konstruktor di sini}}}Dalam skenario ini, saat menggunakan kata kunci baru untuk membuat instance, dua parameter yang ditentukan pada metode konstruksi perlu disediakan secara bersamaan.
konstruktor terakhir dengan konstruktorwithguments = konstruktorwithguments baru ("arg1", "arg2");Menariknya, konstruktor dapat dipanggil satu sama lain melalui kata kunci ini. Dalam praktiknya, disarankan untuk rantai beberapa konstruktor dengan menggunakan ini untuk mengurangi duplikasi kode dan memiliki entri inisialisasi tunggal berdasarkan objek. Sebagai contoh, kode berikut mendefinisikan konstruktor dengan hanya satu parameter.
Public ConstructorWithArguments (final string arg1) {this (arg1, null);}2.4 Inisialisasi blok kode
Selain membangun metode, Java juga menyediakan logika untuk menginisialisasi dengan menginisialisasi blok kode. Meskipun penggunaan ini jarang terjadi, tidak berbahaya mengetahui lebih banyak tentang hal itu.
Paket com.javacodegeeks.advanced.construction; Public Class InitializationBlock {{// Kode Inisialisasi di sini}}Di sisi lain, menginisialisasi blok kode juga dapat dianggap sebagai metode konstruksi implisit tanpa parameter. Di kelas tertentu, beberapa blok kode inisialisasi dapat ditentukan, dan mereka dipanggil dalam urutan mereka dalam kode ketika dieksekusi, seperti yang ditunjukkan dalam kode berikut:
Paket com.javacodegeeks.Advanced.construction; Public Class InitializationBlocks {{// kode inisialisasi di sini} {// kode inisialisasi di sini}}Benar -benar menginisialisasi blok kode bukan untuk menggantikan konstruktor, tetapi mereka dapat muncul secara bersamaan. Tetapi ingat bahwa kode inisialisasi akan dieksekusi sebelum panggilan metode konstruktor segera.
Paket com.javacodegeeks.advanced.construction; kelas publik InitializationBlockandConstructor {{// kode inisialisasi di sini} Publik InitializationBlockandConstructor () {}}2.5 Pastikan konstruksi nilai default
Java memberikan jaminan inisialisasi yang pasti, dan pemrogram dapat menggunakan hasil inisialisasi secara langsung. Instance dan variabel kelas yang tidak diinisialisasi (statika) akan secara otomatis diinisialisasi ke nilai default yang sesuai.
Ketik nilai default
Booleanfalse
byte0
short0
int0
long0l
Char/U0000
float0.0f
double0.0d
Referensi Objek NULL
Tabel 1
Kami menggunakan contoh berikut untuk memverifikasi nilai default pada tabel di atas:
Paket com.javacodegeeks.Advanced.construction; Inisialisasi kelas publik dengan Refaults {private boolean booleanmember; Byte Private Bytemember; Pemain Pendek Pendek Pribadi; intmember int private; Private Long Longmember Long; Private Char Charmember; float float pribadi; doublemember ganda pribadi; referensi objek pribadi; inisialisasi publik denganDefaults () {System.out.println ("booleanMember =" + booleanmember); System.out.println ("Bytemember =" + Bytemember); System.out.println ("Shortmember =" + ShortMember); System.out.println ("IntMember =" + IntMember); System.out.println ("Longmember =" + LongMember); System.out.println ("Charmember =" + Character.codepointat (char baru [] {charmember}, 0)); System.out.println ("floatmember =" + floatmember); System.out.println ("doublemember =" + doublemember); System.out.println ("ReferenceMember =" + ReferenceMember); }}Setelah instantiasi objek menggunakan kata kunci baru:
Inisialisasi Akhir dengan Defaults Inisialisasi dengan Defaults = Inisialisasi Baru dengan Defaults (),
Anda dapat melihat hasil output dari konsol sebagai berikut:
booleanmember = falseebytemember = 0shortmember = 0intmember = 0longmember = 0Charmember = 0Floatmember = 0,0Doublemember = 0,0ReferenceMember = null
2.6 Visibilitas
Konstruktor mengikuti aturan visibilitas Java, dan dapat menentukan apakah konstruktor dapat dipanggil di kelas lain melalui pengubah kontrol akses.
Visibilitas Paket Pengubah Visibilitas Subkelas Visibilitas Publik
Publik terlihat terlihat terlihat terlihat terlihat terlihat
Terlindungi terlihat terlihat, tak terlihat terlihat tidak terlihat
<No Modifier> terlihat, tidak terlihat, tidak terlihat
Private Invisible Invisible Invisible Tabel 2
2.7 Recycling sampah
Java (jvm tepatnya) memiliki mekanisme pengumpulan sampah otomatis. Sederhananya, ketika objek baru dibuat, ia akan secara otomatis mengalokasikan intrinsiknya; Kemudian ketika objek tidak lagi dirujuk, mereka akan dihancurkan secara otomatis dan memori yang sesuai akan didaur ulang.
Koleksi Sampah Java mengadopsi mekanisme daur ulang generasi dan didasarkan pada asumsi bahwa "sebagian besar objek memiliki kehidupan yang singkat" (yaitu, mereka tidak akan dibacakan segera setelah objek dibuat, sehingga mereka dapat dihancurkan dengan aman). Sebagian besar pemrogram terbiasa percaya bahwa penciptaan objek di Java sangat tidak efisien, sehingga mereka harus menghindari penciptaan objek baru sebanyak mungkin. Bahkan, pemahaman ini salah. Overhead membuat objek di Java cukup rendah dan cepat. Overhead besar dari generasi nyata adalah objek kelangsungan hidup jangka panjang yang tidak perlu, sehingga mereka pada akhirnya akan dimigrasi ke usia tua dan menyebabkan stop-the-world terjadi.
2.8 Finalisasi Objek
Kami telah berbicara tentang topik yang terkait dengan metode konstruksi dan inisialisasi objek, tetapi kami belum menyebutkan sisi negatifnya: perusakan objek. Terutama karena Java menggunakan mekanisme pengumpulan sampah untuk mengelola siklus hidup objek, menghancurkan objek yang tidak perlu dan membebaskan memori yang diperlukan menjadi tanggung jawab pengumpulan sampah.
Namun, Java masih menyediakan fitur lain yang mirip dengan finalizer destruktor, yang memikul tanggung jawab membersihkan banyak sumber daya. Finalizer umumnya dipandang sebagai hal yang berbahaya (karena dapat membawa berbagai efek samping dan masalah kinerja). Biasanya, finalizer tidak diperlukan jadi cobalah untuk menghindarinya (kecuali dalam skenario langka yang berisi sejumlah besar objek asli). Sintaks TRY-dengan-sumber daya dan antarmuka yang dapat di-autoklosis yang diperkenalkan di Java 7 dapat digunakan sebagai alternatif untuk finalzer, dan kode ringkas berikut dapat ditulis:
coba (inputStream akhir in = file.newinputStream (path)) {// kode di sini}3. Inisialisasi statis
Di atas kami belajar tentang konstruksi dan inisialisasi instance kelas. Selain itu, Java juga mendukung konstruksi inisialisasi tingkat kelas, yang disebut inisialisasi statis. Inisialisasi statis mirip dengan blok kode inisialisasi yang dijelaskan di atas, kecuali bahwa ada modifikasi kata kunci statis tambahan. Perlu dicatat bahwa inisialisasi statis hanya akan dilakukan sekali ketika kelas dimuat. Contohnya adalah sebagai berikut:
Mirip dengan inisialisasi blok kode, beberapa blok inisialisasi statis dapat didefinisikan dalam kelas, dan posisinya di kelas menentukan urutan di mana mereka dieksekusi pada inisialisasi. Contohnya adalah sebagai berikut;
Paket com.javacodegeeks.advanced.construction; kelas publik staticinitializationBlocks {static {// kode inisialisasi statis di sini} static {// kode inisialisasi statis di sini}}Karena blok inisialisasi statis dapat dipicu oleh beberapa utas yang dieksekusi secara paralel (ketika kelas awalnya dimuat), runtime JVM memastikan bahwa kode yang diinisialisasi dieksekusi hanya sekali dengan cara yang aman-utas.
4. Mode Konstruktor
Berbagai pola konstruktor (pencipta) yang mudah dipahami telah diperkenalkan ke komunitas Java selama bertahun-tahun. Di bawah ini kita akan mempelajari beberapa yang lebih populer: mode singleton, mode kelas tambahan, mode pabrik, dan injeksi ketergantungan (juga dikenal sebagai inversi kontrol).
4.1 Singleton Mode
Singleton adalah sejarah panjang tetapi model kontroversial dalam komunitas pengembangan perangkat lunak. Konsep inti dari pola singleton adalah untuk memastikan bahwa kapan saja kelas tertentu dibuat hanya satu objek. Meskipun kedengarannya sederhana, ada banyak diskusi tentang cara membuat objek dengan cara yang benar dan aman. Kode berikut menunjukkan versi sederhana dari implementasi pola singleton:
Paket com.javacodegeeks.advanced.construction.patterns; kelas publik naivesingleton {instance naivesingleton statis pribadi; private naivesingleton () {} public static naivesingleton getInstance () {if (instance == null) {instance = new naivesingleton (); } return instance; }}Setidaknya ada satu masalah dengan kode di atas: banyak objek dapat dibuat dalam skenario konkurensi multi-utas. Cara yang masuk akal untuk mengimplementasikan (tetapi bukan pemuatan yang tertunda) adalah dengan menggunakan properti statis`final` dari kelas. sebagai berikut:
Properti akhir dari class.package com.javacodegeeks.advanced.construction.patterns; kelas publik eagersingleton {private static final eagersingleton instance = eagersingleton baru (); private eagersingleton () {} public static eagersingleton getInstance () {return instance; }}Jika Anda tidak ingin menyia -nyiakan sumber daya yang berharga dan ingin objek singleton dibuat hanya saat mereka benar -benar dibutuhkan, maka Anda perlu menggunakan metode sinkronisasi eksplisit. Metode ini dapat mengurangi konkurensi di lingkungan multi-threaded (detail lebih lanjut tentang konkurensi Java akan dijelaskan dalam praktik terbaik 9-konkurensi 9-konkurensi canggih Java).
Paket com.javacodegeeks.advanced.construction.patterns; kelas publik Lazysingleton {instance private static lazysingleton; private lazysingleton () {} public static static lazysingleton getInstance () {if (instance == null) {instance = new lazysingleton (); } return instance; }}Saat ini, pola singleton tidak lagi dianggap sebagai pilihan yang baik dalam banyak skenario karena mereka membuat kode kurang mudah diuji. Selain itu, generasi mode injeksi ketergantungan juga membuat mode singleton tidak perlu.
4.2 Kelas Alat/Bantu
Kelas alat/pola kelas bantuan cukup populer di kalangan pengembang Java. Konsep intinya adalah menggunakan kelas yang tidak diinstalisasi (dengan mendeklarasikan konstruktor pribadi), final opsional (lebih detail tentang menyatakan kelas akhir akan diperkenalkan di Java Advanced 3-Class dan Interface Design) dan metode statis. Contohnya adalah sebagai berikut:
Paket com.javacodegeeks.advanced.construction.patterns; helperclass kelas akhir publik {private helperclass () {} public static void helpermethod1 () {// Metode body di sini} public static helpermethod2 () {// Metode tubuh di sini}}Banyak pengembang yang berpengalaman percaya bahwa pola ini akan menjadikan kelas alat wadah untuk berbagai metode yang tidak relevan. Karena beberapa metode tidak memiliki penempatan yang sesuai tetapi perlu digunakan oleh kelas lain, mereka akan secara keliru ditempatkan ke dalam kelas pahat. Desain ini juga harus dihindari di sebagian besar skenario: akan selalu ada cara yang lebih baik untuk menggunakan kembali kode, menjaga kode tetap jelas dan ringkas.
4.3 Model Pabrik
Model pabrik telah terbukti menjadi alat yang sangat kuat bagi pengembang, dan ada banyak cara untuk mengimplementasikannya di Java: metode pabrik dan pabrik abstrak. Contoh termudah adalah dengan menggunakan metode statis untuk mengembalikan instance kelas tertentu (metode pabrik), sebagai berikut:
Paket com.javacodegeeks.advanced.construction.patterns; buku kelas publik {private book (judul string akhir) {} buku statis public newBook (judul string akhir) {return buku baru (judul); }}Meskipun menggunakan metode ini dapat meningkatkan keterbacaan kode, seringkali kontroversial bahwa sulit untuk memberikan skenario Newbook Factory Metode yang lebih kaya. Cara lain untuk mengimplementasikan pola pabrik adalah dengan menggunakan antarmuka atau kelas abstrak (pabrik abstrak). Sebagai berikut, kami mendefinisikan antarmuka pabrik:
Public Interface BookFactory {Book NewBook ();}Bergantung pada galeri gambar, kita dapat memiliki banyak implementasi buku baru yang berbeda:
Perpustakaan Kelas Publik mengimplementasikan BookFactory {@Override Public Book NewBook () {return new paperbook (); }} kelas publik KindLelibrary mengimplementasikan bookfactory {@Override public bookbook () {return new kindlook (); }}Sekarang, berbagai implementasi BookFactory memblokir perbedaan dalam buku -buku tertentu, tetapi memberikan metode buku baru umum.
4.4 Injeksi ketergantungan
Injeksi ketergantungan (juga dikenal sebagai inversi kontrol) dipertimbangkan oleh perancang kelas sebagai praktik desain yang baik: jika beberapa contoh kelas bergantung pada contoh kelas lain, contoh -contoh yang tergantung harus disediakan (disuntikkan) melalui metode konstruktor (atau metode setter, kebijakan, dll.), Daripada dibuat oleh instance itu sendiri. Mari kita lihat kode berikut:
Paket com.javacodegeeks.advanced.construction.patterns; impor java.text.dateFormat; impor java.util.date; kelas publik dependen {private final dateFormat format = dateFormat.getDateInstance (); format string publik (tanggal tanggal akhir) {return format.format (tanggal); }}Kelas dependen membutuhkan instance dari kelas Format Date dan diperoleh dengan DateFormat.getDateInstance () saat membuat instantiasi objek. Cara yang lebih baik harus melakukan hal yang sama dengan membangun parameter metode:
Paket com.javacodegeeks.Advanced.construction.patterns; impor java.text.dateFormat; impor java.util.date; kelas publik dependen {format final final format final; Dependent publik (format format final format) {this.format = format; } format string publik (tanggal tanggal akhir) {return format.format (tanggal); }}Dalam contoh di atas, semua dependensi dari instance kelas disediakan secara eksternal, membuatnya mudah untuk mengubah DateFormat dan mudah menulis kode tes.