JavaRush /Java Blog /Random-ID /Rehat kopi #134. Apa yang harus dihindari saat menulis ko...

Rehat kopi #134. Apa yang harus dihindari saat menulis kode Java. Bagaimana final,final dan finalize digunakan di Java

Dipublikasikan di grup Random-ID

Apa yang Harus Dihindari Saat Menulis Kode Java

Sumber: Medium Kami menyampaikan kepada Anda sebuah artikel yang mencantumkan kesalahan umum yang dilakukan pengembang saat menulis kode Java. Rehat kopi #134.  Apa yang harus dihindari saat menulis kode Java.  Bagaimana final,final dan finalize digunakan di Java - 1

Menggunakan Enum.values

Bahwa ini dianggap sebagai bug mengejutkan saya karena saya menggunakan Enum.values ​​​​secara teratur . Masalahnya di sini adalah Enum.values() seharusnya merupakan daftar yang tidak dapat diubah berdasarkan spesifikasi. Untuk melakukan ini, ia harus mengembalikan instance array baru dengan nilai enum setiap kali dipanggil.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Ada dua objek terpisah dalam memori di sini, jadi sepertinya ini bukan masalah besar. Namun jika Anda menggunakan Fruit.values() saat memproses permintaan dan Anda memiliki beban yang tinggi, hal ini dapat menyebabkan masalah memori. Anda dapat dengan mudah memperbaikinya dengan memperkenalkan variabel final statis pribadi VALUES untuk cache.

Melewati parameter Opsional sebagai parameter metode

Perhatikan kode berikut:
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Kami meneruskan parameter Opsional zoneId dan, berdasarkan keberadaannya, memutuskan apakah akan memberikan waktu dalam zona waktu sistem atau menggunakan zona yang ditentukan. Namun, ini bukan cara yang tepat untuk bekerja dengan Opsional. Kita harus menghindari menggunakannya sebagai parameter dan sebagai gantinya menggunakan metode yang berlebihan.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
Kode yang Anda lihat di atas lebih mudah dibaca dan di-debug.

Menggunakan StringBuilder

String di Java tidak dapat diubah. Artinya, setelah dibuat, file tersebut tidak lagi dapat diedit. JVM memelihara kumpulan string dan, sebelum membuat yang baru, memanggil metode String.intern() , yang mengembalikan sebuah instance dari kumpulan string yang sesuai dengan nilainya, jika ada. Katakanlah kita ingin membuat string panjang dengan menggabungkan elemen ke dalamnya.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
Kami baru-baru ini diberitahu bahwa ini adalah ide yang sangat buruk karena versi Java yang lebih lama melakukan hal berikut:
  • pada baris 1 string “start” dimasukkan ke dalam string pool dan ditunjuk oleh longString
  • baris 2 menambahkan string "startmiddle" ke kumpulan dan menunjuknya dengan longString
  • di baris 3 kita memiliki "startmiddlemiddle"
  • di baris 4 - “mulai tengah tengah tengah”
  • dan terakhir pada baris 5 kita menambahkan "startmiddlemiddlemiddleend" ke pool dan arahkan longString ke sana
Semua baris ini tetap berada di kumpulan dan tidak pernah digunakan, mengakibatkan sejumlah besar RAM terbuang sia-sia. Untuk menghindari hal ini kita dapat menggunakan StringBuilder.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder hanya membuat satu string ketika metode toString dipanggil , sehingga membuang semua string perantara yang awalnya ditambahkan ke kumpulan. Namun, setelah Java 5 hal ini dilakukan secara otomatis oleh compiler , jadi lebih baik menggunakan penggabungan string menggunakan “+”.

Menggunakan pembungkus primitif saat tidak diperlukan

Perhatikan dua penggalan berikut:
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Contoh pertama berjalan enam kali lebih cepat daripada contoh kedua di komputer saya. Satu-satunya perbedaan adalah kita menggunakan kelas pembungkus Integer. Cara kerja Integer adalah pada baris 3, runtime harus mengubah variabel penjumlahan menjadi bilangan bulat primitif (unboxing otomatis), dan setelah dilakukan penambahan, hasilnya kemudian dimasukkan ke dalam kelas Integer baru. (kemasan otomatis). Ini berarti kami menciptakan 1 juta kelas Integer dan melakukan dua juta operasi pengemasan, yang menjelaskan perlambatan dramatis ini. Kelas wrapper hanya boleh digunakan ketika perlu disimpan dalam koleksi. Namun, versi Java yang akan datang akan mendukung kumpulan tipe primitif, yang akan membuat wrapper menjadi usang.

Bagaimana final,final dan finalize digunakan di Java

Sumber: Newsshare Pada artikel ini Anda akan mempelajari di mana, kapan, dan mengapa kata kunci Finalize digunakan, dan apakah kata kunci tersebut layak digunakan di Java. Anda juga akan mempelajari perbedaan antara final, akhirnya, dan finalisasi.

Di mana blok akhirnya digunakan?

Blok akhirnya di Java digunakan untuk menampung bagian-bagian penting dari kode seperti kode pembersihan, penutupan file, atau penutupan koneksi, misalnya. Blok akhirnya dijalankan terlepas dari apakah pengecualian dilemparkan atau apakah pengecualian tersebut ditangani. A akhirnya berisi semua pernyataan penting apakah terjadi pengecualian atau tidak.

Bagaimana Anda menyelesaikan variabel di Java?

Ada 3 cara untuk menginisialisasi variabel Java final:
  • Anda dapat menginisialisasi variabel final ketika dideklarasikan. Pendekatan ini adalah yang paling umum.
  • Variabel final yang kosong diinisialisasi dalam blok atau konstruktor penginisialisasi instance.
  • Variabel statis akhir yang kosong diinisialisasi di dalam blok statis.

Bisakah kita memanggil metode finalisasi secara manual di Java?

Metode finalize() tidak diperlukan dan tidak disarankan untuk dipanggil ketika suatu objek berada di luar cakupan. Karena tidak diketahui sebelumnya kapan (atau apakah) metode finalize() akan dijalankan . Secara umum, finalisasi bukanlah metode terbaik untuk digunakan kecuali ada kebutuhan khusus untuk itu. Dimulai dengan Java 9 sudah tidak digunakan lagi.

Kapan metode finalisasi dipanggil?

Metode finalize() dipanggil untuk melakukan pembersihan sesaat sebelum pengumpulan sampah.

Apa perbedaan antara final, akhirnya dan finalisasi?

Perbedaan utama antara final,final, dan finalize adalah final adalah pengubah akses, final adalah blok dalam penanganan pengecualian, dan finalisasi adalah metode kelas objek.

Apakah mungkin untuk mengganti metode terakhir?

Tidak, metode yang dinyatakan final tidak dapat ditimpa atau disembunyikan.

Bisakah kita menggunakan try tanpa catch?

Ya, dimungkinkan untuk memiliki blok try tanpa blok catch dengan menggunakan final block . Seperti yang kita ketahui, blok terakhir akan selalu dieksekusi meskipun ada pengecualian selain Sistem yang terjadi di blok coba.

Apa metode terakhirnya?

Metode final tidak dapat ditimpa atau disembunyikan oleh subkelas. Mereka digunakan untuk mencegah perilaku tak terduga dari subkelas yang memodifikasi metode yang mungkin penting bagi fungsi atau konsistensi kelas.

Bisakah konstruktor menjadi final?

Konstruktor TIDAK PERNAH dapat dinyatakan final. Kompiler Anda akan selalu memunculkan kesalahan seperti "pengubah akhir tidak diizinkan". Final ketika diterapkan pada metode berarti bahwa metode tersebut tidak dapat ditimpa dalam subkelas. Konstruktor BUKAN metode biasa.

Kata kunci akhirnya digunakan untuk apa?

Kata kunci akhirnya digunakan untuk membuat blok kode setelah blok coba. Blok akhirnya selalu dijalankan terlepas dari apakah pengecualian terjadi. Menggunakan blok akhirnya memungkinkan Anda menjalankan pernyataan tipe pelepasan apa pun yang ingin Anda jalankan, terlepas dari apa yang terjadi dalam kode yang dilindungi.

Apa gunanya akhirnya?

Blok akhirnya di Java adalah blok yang digunakan untuk mengeksekusi bagian-bagian kode seperti menutup koneksi dan lain-lain. Blok akhirnya di Java selalu dieksekusi baik pengecualian ditangani atau tidak. Oleh karena itu, ini berisi semua pernyataan penting yang perlu dicetak apakah terjadi pengecualian atau tidak.

Mengapa metode Finalisasi dilindungi?

Mengapa pengubah akses metode finalize() dilindungi? Mengapa tidak bisa dipublikasikan? Ini bukan bersifat publik karena tidak boleh dipanggil oleh orang lain selain JVM. Namun, ia harus dilindungi agar dapat ditimpa oleh subkelas yang perlu mendefinisikan perilakunya.

Apakah metode finalisasi selalu dipanggil di Java?

Metode finalisasi dipanggil ketika suatu objek hendak dikumpulkan sampahnya. Hal ini dapat terjadi kapan saja setelah memenuhi syarat untuk pengumpulan sampah. Perhatikan bahwa sangat mungkin bahwa objek tersebut tidak pernah dikumpulkan sampahnya (dan oleh karena itu finalisasi tidak pernah dipanggil).

Apa perbedaan antara melempar dan melempar?

Kata kunci throw digunakan untuk melemparkan pengecualian secara sengaja. Kata kunci throws digunakan untuk mendeklarasikan satu atau lebih pengecualian, dipisahkan dengan koma. Saat menggunakan lemparan, hanya satu pengecualian yang dilempar.

Apa perbedaan antara kata kunci coba tangkap dan akhirnya?

Ini adalah dua konsep yang berbeda: blok catch dijalankan hanya jika pengecualian terjadi di blok try. Blok akhirnya selalu dieksekusi setelah blok try(-catch), terlepas dari apakah pengecualian dilemparkan atau tidak.

Bisakah kita menggunakan akhirnya tanpa mencoba di Java?

Blok akhirnya harus dikaitkan dengan blok coba, Anda tidak dapat menggunakan akhirnya tanpa blok coba. Anda harus menempatkan di blok ini pernyataan-pernyataan yang harus selalu dieksekusi.

Bisakah kita mewarisi metode terakhir?

Apakah metode terakhir diwariskan? Ya, metode terakhir diwariskan, tetapi Anda tidak dapat menimpanya.

Metode manakah yang tidak dapat ditimpa?

Kita tidak dapat mengganti metode statis karena penggantian metode didasarkan pada tautan dinamis pada waktu proses dan metode statis diikat menggunakan tautan statis pada waktu kompilasi. Dengan demikian, mengesampingkan metode statis tidak mungkin dilakukan.

Apa yang terjadi jika metode terakhir ditimpa?

Metode terakhir yang dideklarasikan di kelas induk tidak dapat ditimpa oleh kelas anak. Jika kita mencoba mengganti metode terakhir, kompiler akan mengeluarkan pengecualian pada waktu kompilasi.

Apakah kata kunci final dan metode finalisasi berfungsi sama?

Tidak ada persamaan fungsinya, kecuali kemiripan nama. Kata kunci terakhir dapat digunakan dengan kelas, metode atau variabel di Java. Kelas final tidak dapat diperluas di Java, metode final tidak dapat ditimpa, dan variabel final tidak dapat diubah.

Apa kata kunci super di Java?

Kata kunci super di Java adalah variabel referensi yang digunakan untuk merujuk ke objek langsung dari kelas induk. Setiap kali Anda membuat instance subkelas, turunan dari kelas induk dibuat secara paralel, yang direferensikan oleh variabel referensi super. Kata kunci super dapat digunakan untuk memanggil metode kelas induk secara langsung.

Apa perbedaan antara kata kunci statis dan kata kunci final?

Perbedaan utama antara kata kunci statis dan final adalah bahwa kata kunci statis digunakan untuk mendefinisikan anggota kelas yang dapat digunakan secara independen dari objek apa pun di kelas tersebut. Kata kunci Final digunakan untuk mendeklarasikan variabel konstan, metode yang tidak dapat ditimpa, dan kelas yang tidak dapat diwariskan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION