Satu-satunya masalah dengan itu adalah bahwa itu mengacaukan namespace lokal Anda. Sebagai contoh, katakanlah Anda sedang menulis aplikasi Swing, dan perlu java.awt.Event
, dan juga berinteraksi dengan sistem kalender perusahaan, yang memiliki com.mycompany.calendar.Event
. Jika Anda mengimpor keduanya menggunakan metode wildcard, salah satu dari tiga hal ini terjadi:
- Anda memiliki konflik penamaan langsung antara
java.awt.Event
dan com.mycompany.calendar.Event
, sehingga Anda bahkan tidak dapat mengompilasi.
- Anda benar-benar hanya dapat mengimpor satu (hanya satu dari dua impor Anda yang melakukannya
.*
), tetapi yang salah, dan Anda berjuang untuk mencari tahu mengapa kode Anda mengklaim jenis itu salah.
- Ketika Anda mengkompilasi kode Anda tidak ada
com.mycompany.calendar.Event
, tetapi ketika mereka nanti menambahkan satu kode Anda yang sebelumnya valid tiba-tiba berhenti mengkompilasi.
Keuntungan dari mendaftar secara eksplisit semua impor adalah bahwa saya dapat melihat sekilas kelas mana yang ingin Anda gunakan, yang hanya membuat membaca kode lebih mudah. Jika Anda hanya melakukan satu hal cepat, tidak ada yang salah secara eksplisit , tetapi pengelola masa depan akan berterima kasih atas kejelasan Anda sebaliknya.
Ini suara untuk impor bintang. Pernyataan impor dimaksudkan untuk mengimpor paket , bukan kelas. Jauh lebih bersih untuk mengimpor seluruh paket; masalah yang diidentifikasi di sini (misalnya
java.sql.Date
vsjava.util.Date
) mudah diperbaiki dengan cara lain, tidak juga ditangani oleh impor tertentu dan tentu saja tidak membenarkan impor gila-gilaan gila-gilaan di semua kelas. Tidak ada yang lebih membingungkan daripada membuka file sumber dan harus halaman melalui 100 pernyataan impor.Melakukan impor tertentu membuat refactoring lebih sulit; jika Anda menghapus / mengganti nama kelas, Anda harus menghapus semua impor spesifiknya. Jika Anda beralih implementasi ke kelas yang berbeda dalam paket yang sama, Anda harus memperbaiki impor. Meskipun langkah-langkah tambahan ini dapat diotomatisasi, mereka benar-benar hit produktivitas tanpa keuntungan nyata.
Bahkan jika Eclipse tidak melakukan impor kelas secara default, semua orang masih akan melakukan impor bintang. Maaf, tetapi benar-benar tidak ada pembenaran rasional untuk melakukan impor tertentu.
Berikut cara mengatasi konflik kelas:
sumber
Foo
, dan jika saya membaca kode Anda tanpa menggunakan IDE (karena argumen Anda adalah bahwa saya tidak harus menggunakannya), bagaimana saya tahu dari mana paketFoo
berasal ? Tentu, menggunakan IDE, IDE akan memberi tahu saya, tetapi seluruh argumen Anda adalah bahwa saya harus dapat membaca kode tanpa itu. Melakukan impor eksplisit membantu mendokumentasikan kode (alasan bagus untuk menghindari wildcard) , dan jauh lebih mungkin bahwa saya akan membaca kode tanpa menggunakan IDE, daripada itu saya akan menulis kode tanpa menggunakan IDE.silakan lihat artikel saya Impor Sesuai Permintaan Adalah Jahat
Singkatnya, masalah terbesar adalah kode Anda dapat pecah ketika kelas ditambahkan ke paket yang Anda impor. Sebagai contoh:
Di Jawa 1.1, ini baik-baik saja; Daftar ditemukan di java.awt dan tidak ada konflik.
Sekarang anggaplah Anda memeriksa kode Anda yang berfungsi dengan baik, dan setahun kemudian orang lain mengeluarkannya untuk mengeditnya, dan menggunakan Java 1.2.
Java 1.2 menambahkan antarmuka bernama List ke java.util. LEDAKAN! Konflik. Kode yang berfungsi sempurna tidak lagi berfungsi.
Ini adalah fitur bahasa EVIL . Tidak ada alasan bahwa kode harus berhenti dikompilasi hanya karena tipe ditambahkan ke paket ...
Selain itu, sulit bagi pembaca untuk menentukan "Foo" mana yang Anda gunakan.
sumber
java.util.List
vsjava.awt.List
tidak terlalu buruk untuk mencari tahu, tetapi cobalah ketika nama kelasnyaConfiguration
dan beberapa perpustakaan dependensi telah menambahkannya dalam versi repo maven terbaru mereka.Ini tidak buruk untuk menggunakan kartu liar dengan pernyataan impor Java.
Dalam Clean Code , Robert C. Martin sebenarnya merekomendasikan penggunaannya untuk menghindari daftar impor yang panjang.
Berikut rekomendasinya:
sumber
Kinerja : Tidak berdampak pada kinerja karena kode byte sama. meskipun itu akan menyebabkan beberapa overhead kompilasi.
Kompilasi : pada mesin pribadi saya, Mengkompilasi kelas kosong tanpa mengimpor apa pun membutuhkan 100 ms tetapi kelas yang sama ketika mengimpor java. * Membutuhkan 170 ms.
sumber
import java.*
tidak mengimpor apa pun. Mengapa itu membuat perbedaan?Ini mengacaukan namespace Anda, mengharuskan Anda untuk sepenuhnya menentukan nama kelas yang ambigu. Kejadian paling umum dari ini adalah dengan:
Ini juga membantu membuat dependensi Anda menjadi konkret, karena semua dependensi Anda tercantum di bagian atas file.
sumber
Sebagian besar tempat saya bekerja yang menggunakan sejumlah besar Java membuat impor eksplisit bagian dari standar pengkodean. Saya kadang-kadang masih menggunakan * untuk prototyping cepat dan kemudian memperluas daftar impor (beberapa IDE akan melakukan ini untuk Anda juga) ketika memproduksi kode.
sumber
Saya lebih suka impor khusus, karena memungkinkan saya untuk melihat semua referensi eksternal yang digunakan dalam file tanpa melihat keseluruhan file. (Ya, saya tahu itu tidak harus menunjukkan referensi yang sepenuhnya memenuhi syarat. Tapi saya menghindarinya jika memungkinkan.)
sumber
Dalam proyek sebelumnya saya menemukan bahwa mengubah dari * * impor ke impor tertentu mengurangi waktu kompilasi hingga setengahnya (dari sekitar 10 menit menjadi sekitar 5 menit). * -Import membuat compiler mencari setiap paket yang terdaftar untuk kelas yang cocok dengan yang Anda gunakan. Meskipun saat ini bisa kecil, itu menambah untuk proyek-proyek besar.
Efek samping dari * -import adalah bahwa pengembang akan menyalin dan menempelkan jalur impor umum daripada memikirkan apa yang mereka butuhkan.
sumber
Dalam buku DDD
Dan jika itu mengacaukan namespace lokal itu bukan kesalahan Anda - salahkan ukuran paket.
sumber
Tidak ada dampak runtime, karena kompiler secara otomatis mengganti * dengan nama kelas yang konkret. Jika Anda mendekompilasi file .class, Anda tidak akan pernah melihat
import ...*
.C # selalu menggunakan * (secara implisit) karena Anda hanya dapat
using
mengemas nama. Anda tidak pernah dapat menentukan nama kelas sama sekali. Java memperkenalkan fitur setelah c #. (Java sangat rumit dalam banyak aspek tetapi di luar topik ini).Di Intellij Idea saat Anda "mengatur impor", secara otomatis menggantikan beberapa impor dari paket yang sama dengan *. Ini adalah fitur wajib karena Anda tidak dapat mematikannya (meskipun Anda dapat meningkatkan ambang batas).
Kasing yang terdaftar dengan balasan yang diterima tidak valid. Tanpa * Anda masih mendapatkan masalah yang sama. Anda perlu menentukan nama pakcage dalam kode Anda tidak peduli Anda menggunakan * atau tidak.
sumber
Sebagai catatan: Ketika Anda menambahkan impor, Anda juga menunjukkan dependensi Anda.
Anda dapat melihat dengan cepat apa dependensi file (tidak termasuk kelas dari namespace yang sama).
sumber
Yang paling penting adalah bahwa mengimpor
java.awt.*
dapat membuat program Anda tidak kompatibel dengan versi Java di masa depan:Misalkan Anda memiliki kelas bernama "ABC", Anda menggunakan JDK 8 dan Anda mengimpor
java.util.*
. Sekarang, anggaplah Java 9 keluar, dan ia memiliki kelas baru dalam paketjava.util
yang kebetulan juga disebut "ABC". Program Anda sekarang tidak dapat dikompilasi di Java 9, karena kompiler tidak tahu apakah dengan nama "ABC" yang Anda maksud adalah kelas Anda sendiri atau kelas baru dijava.awt
.Anda tidak akan memiliki masalah ketika Anda hanya mengimpor dari kelas-kelas itu secara eksplisit
java.awt
yang Anda gunakan.Sumber:
Impor Java
sumber
Stream
contoh kelas baru yang ditambahkan di Java di java.util di Java 8 ...Di antara semua poin valid yang dibuat di kedua sisi saya belum menemukan alasan utama saya untuk menghindari wildcard: Saya ingin dapat membaca kode dan tahu secara langsung apa setiap kelas, atau apakah definisi itu tidak dalam bahasa atau file, di mana menemukannya. Jika lebih dari satu paket diimpor dengan * Saya harus pergi mencari masing-masing untuk menemukan kelas yang tidak saya kenal. Keterbacaan adalah yang tertinggi, dan saya setuju bahwa kode tidak memerlukan IDE untuk membacanya.
sumber