1. Gambaran keseluruhan
Dalam tutorial ini, kita akan mengetahui apa yang menjadikan objek tidak berubah, bagaimana mencapai kebolehubahan di Jawa, dan kelebihan apa yang dilakukan dengan melakukannya.
2. Apakah Objek yang Tidak Berubah?
Objek yang tidak berubah adalah objek yang keadaan dalamannya tetap berterusan setelah ia diciptakan sepenuhnya .
Ini bermaksud bahawa API awam objek yang tidak dapat diubah menjamin kita bahawa ia akan berperilaku dengan cara yang sama sepanjang hayatnya.
Sekiranya kita melihat kelas String , kita dapat melihat bahawa walaupun APInya nampaknya memberi kita tingkah laku yang dapat diubah dengan kaedah penggantiannya , String yang asal tidak berubah:
String name = "baeldung"; String newName = name.replace("dung", "----"); assertEquals("baeldung", name); assertEquals("bael----", newName);
API memberikan kita kaedah baca sahaja, tidak boleh merangkumi kaedah yang mengubah keadaan dalaman objek.
3. Kata Kunci terakhir di Java
Sebelum berusaha mencapai kebolehubahan di Java, kita harus membincangkan kata kunci terakhir .
Di Java, pemboleh ubah dapat diubah secara lalai, yang bermaksud kita dapat mengubah nilai yang dimiliki .
Dengan menggunakan kata kunci akhir ketika menyatakan pemboleh ubah, penyusun Java tidak akan membiarkan kita mengubah nilai pemboleh ubah tersebut. Sebaliknya, ia akan melaporkan ralat waktu kompilasi:
final String name = "baeldung"; name = "bael...";
Perhatikan bahawa final hanya melarang kita mengubah rujukan yang dimiliki pemboleh ubah, ia tidak melindungi kita daripada mengubah keadaan dalaman objek yang dirujuknya dengan menggunakan API awamnya:
final List strings = new ArrayList(); assertEquals(0, strings.size()); strings.add("baeldung"); assertEquals(0, strings.size());
AssertEquals kedua akan gagal kerana menambahkan elemen ke dalam senarai akan mengubah ukurannya, oleh itu, ia bukan objek yang tidak berubah.
4. Kebolehubahan di Jawa
Sekarang setelah kita mengetahui bagaimana menghindari perubahan pada isi pemboleh ubah, kita dapat menggunakannya untuk membangun API objek yang tidak berubah.
Membangun API objek yang tidak berubah memerlukan kita menjamin bahawa keadaan dalamannya tidak akan berubah walau bagaimana kita menggunakan APInya.
Langkah maju ke arah yang benar adalah menggunakan akhir ketika menyatakan atributnya:
class Money { private final double amount; private final Currency currency; // ... }
Perhatikan bahawa Java menjamin kita bahawa nilai jumlah tidak akan berubah, begitulah keadaannya dengan semua pemboleh ubah jenis primitif.
Walau bagaimanapun, dalam contoh kita hanya dijamin bahawa mata wang tidak akan berubah, jadi kita mesti bergantung pada API Mata Wang untuk melindungi dirinya dari perubahan .
Selalunya, kita memerlukan atribut objek untuk menyimpan nilai tersuai, dan tempat untuk memulakan keadaan dalaman objek tidak berubah adalah pembentuknya:
class Money { // ... public Money(double amount, Currency currency) { this.amount = amount; this.currency = currency; } public Currency getCurrency() { return currency; } public double getAmount() { return amount; } }
Seperti yang telah kami katakan sebelumnya, untuk memenuhi syarat API yang tidak berubah, kelas Wang kami hanya mempunyai kaedah baca sahaja.
Dengan menggunakan API pantulan, kita dapat memecahkan kebolehubahan dan mengubah objek yang tidak berubah. Walau bagaimanapun, refleksi melanggar API awam objek yang tidak berubah, dan biasanya, kita harus mengelakkannya.5. Faedah
Oleh kerana keadaan dalaman objek yang tidak berubah tetap berubah dalam masa, kita dapat membaginya dengan selamat di antara banyak utas .
Kita juga dapat menggunakannya dengan bebas, dan tidak ada objek yang merujuknya yang akan melihat perbezaannya, kita boleh mengatakan bahawa objek yang tidak berubah bebas dari kesan sampingan .
6. Kesimpulannya
Objek yang tidak dapat diubah tidak mengubah keadaan dalamannya pada waktunya, ia selamat dari benang dan bebas dari kesan sampingan. Kerana sifat-sifat itu, objek yang tidak berubah juga sangat berguna ketika berhadapan dengan persekitaran berbilang benang.
Anda boleh mendapatkan contoh yang digunakan dalam artikel ini di GitHub.