Adakah alasan untuk membersihkan impor yang tidak terpakai di Jawa, selain mengurangi kekacauan?

99

Apakah ada alasan bagus untuk menghindari pernyataan impor yang tidak digunakan di Java? Seperti yang saya pahami, mereka ada untuk kompiler, jadi banyak impor yang tidak digunakan tidak akan berdampak pada kode yang dikompilasi. Apakah itu hanya untuk mengurangi kekacauan dan untuk menghindari konflik penamaan di kemudian hari?

(Saya bertanya karena Eclipse memberikan peringatan tentang impor yang tidak digunakan, yang agak mengganggu ketika saya mengembangkan kode karena saya tidak ingin menghapus impor sampai saya cukup yakin saya selesai mendesain kelas.)

Tidur
sumber

Jawaban:

86

Saya tidak berpikir bahwa masalah kinerja atau semacamnya mungkin terjadi jika Anda tidak menghapus impor.

Tetapi mungkin ada konflik penamaan, dalam kasus yang jarang terjadi seperti mengimpor antarmuka daftar.

Di Eclipse Anda selalu dapat menggunakan pintasan (bergantung pada OS - Win: Ctrl + SHIFT + Odan Mac :) COMMAND + SHIFT + Ountuk mengatur impor. Eclipse kemudian membersihkan bagian impor menghapus semua impor basi dll. Jika Anda membutuhkan barang yang diimpor lagi, gerhana akan menambahkannya secara otomatis saat Anda menyelesaikan pernyataan dengan Ctrl + SPACE. Jadi tidak perlu menyimpan kode yang tidak digunakan di kelas Anda.

Seperti biasa kode yang tidak terpakai akan mengganggu Anda dan orang lain saat membaca kode dan meninggalkan sesuatu di kode aktif Anda karena mungkin saya membutuhkannya nanti sebagian besar dilihat sebagai praktik yang buruk.

Janusz
sumber
22
Ini sebenarnya Ctrl + Shift + O di windows.
Matt Ball
1
Ctrl + Shift + O di linux dengan baik. Mungkin sama di BSD.
WhyNotHugo
2
Cara lain untuk mendapatkannya tindakan mengatur impor adalah dengan mengklik ctrl+3(setidaknya pada windwos) dan kemudian mengetik impor. Ini jelas lebih lambat dari ctrl + shift + O tetapi ini adalah cara untuk menemukannya dengan cepat (dan banyak tindakan lain yang Anda ingat atau coba temukan) bahkan jika Anda tidak ingat pintasan khusus untuk ini.
epeleg
53

Salah satunya adalah jika Anda menghapus kelas yang direferensikan oleh impor dari classpath, Anda tidak akan mendapatkan kesalahan kompiler konyol yang tidak memiliki tujuan. Dan Anda tidak akan mendapatkan positif palsu saat melakukan penelusuran "di mana digunakan".

Lainnya (tapi ini akan sangat spesifik di alam) akan terjadi jika impor yang tidak digunakan memiliki konflik penamaan dengan impor lain, menyebabkan Anda menggunakan nama yang sepenuhnya memenuhi syarat secara tidak perlu.

Tambahan: Hari ini server build mulai gagal dalam kompilasi (bahkan pengujian tidak berjalan) dengan kesalahan memori habis. Itu berjalan dengan baik selamanya dan check-in tidak memiliki perubahan apa pun pada proses pembuatan atau penambahan signifikan yang dapat menjelaskan hal ini. Setelah mencoba meningkatkan pengaturan memori (ini menjalankan 64 bit JVM pada 64 bit CentOS!) Ke sesuatu yang jauh melampaui tempat klien dapat mengkompilasi, saya memeriksa check in satu per satu.

Ada impor yang tidak tepat yang telah digunakan dan ditinggalkan oleh pengembang (mereka menggunakan kelas, mengimpornya secara otomatis, dan kemudian menyadari bahwa itu adalah kesalahan). Impor yang tidak terpakai itu menarik seluruh tingkatan aplikasi yang terpisah, yang, meskipun IDE tidak dikonfigurasi untuk memisahkannya, proses build-nya. Impor tunggal itu menyeret begitu banyak kelas sehingga kompilator berusaha untuk mengompilasi tanpa perpustakaan dependen yang relevan di classpath, hal ini menyebabkan begitu banyak masalah yang menyebabkan kesalahan kehabisan memori. Butuh waktu satu jam untuk mengatasi masalah ini yang disebabkan oleh impor yang tidak terpakai.

Yishai
sumber
4
@Yishai, jika Anda menggunakan Eclipse, lihat Save Actions, yang dapat menormalkan kode sumber setiap kali Anda menyimpan.
Thorbjørn Ravn Andersen
2
@EJP, meskipun tidak memengaruhi bytecode yang dihasilkan, compiler perlu menyelesaikannya untuk memahami bytecode yang perlu dibuat.
Yishai
3
@EJP, seluruh tambahan berbicara tentang waktu kompilasi ("server build mulai gagal kompilasi").
Yishai
1
Saya masih tidak mengerti bagaimana impor saja bisa menyebabkan semua ini?
Thorbjørn Ravn Andersen
1
@Yishai Maaf tapi saya tidak percaya. Anda telah salah mendiagnosis ini. Impor seharusnya tidak memiliki efek seperti itu, kecuali kelas tersebut benar-benar digunakan. Semua pernyataan import adalah memberi tahu kompilator di paket mana kelas itu berada. Kompilator hanya mencoba untuk mengkompilasi secara implisit ketika ia membutuhkan informasi jenis tentang kelas itu.
Marquis dari Lorne
9

Dari sudut pandang yang murni, ketergantungan apa pun adalah "kendala" pada produk dan dengan demikian dapat menyebabkan masalah perawatan di kemudian hari.

Sebagai contoh, anggaplah program Anda menggunakan kelas com.XYZObjectPool, dan kemudian Anda memutuskan untuk tidak menggunakannya tetapi tidak pernah menghapus impor. Jika orang lain sekarang ingin membuat instance org.WVYObjectPool dan hanya merujuk ke ObjectPool, mereka tidak mendapatkan peringatan apa pun tentang hal itu sampai suatu saat ada masalah casting atau masalah pemanggilan.

Omong-omong, ini bukan skenario yang tidak realistis. Setiap kali Anda meminta Eclipse menanyakan versi X mana yang ingin Anda impor, dan Anda memilih satu dari banyak paket, adalah skenario di mana jika Anda telah mengimpor di sana, Anda mungkin mendapatkan pilihan yang salah tanpa mengetahuinya.

Apa pun itu, Anda dapat meminta Eclipse untuk membersihkannya untuk Anda

Uri
sumber
3

Peringatan? Minta Eclipse untuk membersihkannya secara otomatis untuk Anda. Itulah yang dilakukan IntelliJ. Jika cukup pintar untuk memperingatkan Anda, itu harus cukup pintar untuk membersihkannya. Saya akan merekomendasikan mencari pengaturan Eclipse untuk memberitahunya untuk berhenti menjadi cerewet dan melakukan sesuatu.

duffymo
sumber
4
Thats Save Actions. Secara pribadi saya suka bahwa Eclipse hanya mengubah kode Anda ketika Anda secara eksplisit memintanya.
Thorbjørn Ravn Andersen
1
@ Thorbjørn: Setuju, terutama jika ini adalah kelas yang telah saya berhenti gunakan untuk sedikit tetapi saya berharap dapat menambahkan kembali segera.
Donal Fellows
2
@Donal, yah, untuk itulah Ctrl-Space.
Thorbjørn Ravn Andersen
3

Ini ada hubungannya dengan kejelasan program yang berguna untuk pemeliharaan.

Jika Anda harus mempertahankan program, Anda akan menemukan betapa bermanfaatnya memiliki impor kelas tunggal per baris.

Pikirkan tentang skenario berikut ini:

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

Saat Anda memperbaiki bug atau memelihara bagian kode (atau hanya membacanya), sangat membantu bagi pembaca untuk mengetahui paket mana yang dimiliki kelas yang digunakan. Menggunakan impor karakter pengganti seperti yang ditunjukkan di atas tidak membantu untuk tujuan itu.

Bahkan dengan IDE, Anda tidak ingin mengarahkan atau melompat ke deklarasi dan kembali, akan lebih mudah jika Anda memahami dari segi fungsionalitas, paket dan kelas lain yang bergantung pada kode saat ini.

Jika ini untuk proyek pribadi atau sesuatu yang kecil, itu benar-benar tidak masalah, tetapi untuk sesuatu yang lebih besar yang harus digunakan oleh pengembang lain (dan dipertahankan selama bertahun-tahun) ini HARUS DIMILIKI.

Sama sekali tidak ada perbedaan kinerja dengan apapun.

OscarRyz
sumber
3

FYI, Ini menarik perhatian saya, karena saya tidak berpikir impor terorganisir benar-benar menghapus impor yang tidak digunakan, saya pikir itu hanya menyortirnya.

Menghapus impor secara otomatis selama operasi penyimpanan membuat saya sedih ketika misalnya, selama pengembangan atau pengujian Anda memiliki masalah dan mengomentari beberapa kode, ketika Anda menyimpannya, impor yang digunakan oleh bagian kode yang diberi komentar dihapus. Terkadang ini bukan masalah karena Anda dapat membatalkan ( Ctrl+ Z) perubahan, tetapi di lain waktu tidak sesederhana itu karena Anda mungkin telah membuat perubahan lain. Saya juga mengalami masalah ketika saya menghapus komentar kode (saya sebelumnya telah berkomentar lalu menyimpan, sehingga menghapus impor untuk kode itu), secara otomatis mencoba menebak impor yang diperlukan dan mengambil yang salah (misalnya saya pikir saya memiliki StringUtilskelas yang digunakan dan mengambil kelas lain dengan nama yang sama dari perpustakaan yang salah).

Saya lebih suka mengatur impor secara manual daripada menjadikannya sebagai tindakan penyimpanan.

John
sumber
2

Untuk gerhana saya menggunakan ini: jendela -> preferensi -> java -> editor -> simpan tindakan -> centang kotak centang untuk mengatur impor (ada banyak hal berguna lainnya di sana juga, seperti pemformatan, membuat bidang final dan sebagainya. .). Jadi, ketika saya menyimpan file saya, gerhana menghapus impor yang tidak terhapus untuk saya. Menurut pendapat saya, jika Anda tidak membutuhkan sesuatu maka keluarkan (atau biarkan dihapus oleh gerhana).

kukudas
sumber
2

Anda dapat mengomentari pernyataan impor yang tidak digunakan dan peringatan tidak akan mengganggu Anda, tetapi Anda dapat melihat apa yang Anda miliki.

Sharon
sumber
2
@DimaSan Sebenarnya begitu: pertanyaannya mengatakan saya tidak ingin menghapus impor sampai saya cukup yakin saya selesai mendesain kelas.
The Vee
1

Tidak ada dampak kinerja apa pun, meski untuk keterbacaan Anda bisa membuatnya bersih. Menghapus impor yang tidak digunakan cukup mudah di Eclipse dan IntelliJ IDEA.

Gerhana

Windows / Linux -    Ctrl+ Shift+O

Mac -                        Cmd+ Shift+O

IntelliJ IDEA atau Android Studio

Windows / Linux -    Ctrl+ Alt+O

Mac -                        Cmd+ Alt+O

Madan Sapkota
sumber
0

Saya membaca di suatu tempat, beberapa tahun yang lalu, bahwa setiap kelas yang diimpor akan dimuat saat runtime dengan kelas pengimpor. Jadi menghapus yang tidak terpakai, terutama seluruh paket, akan mengurangi overhead memori. Meskipun saya kira bahwa versi java modern berurusan dengan itu, jadi mungkin itu bukan alasan lagi.

Dan omong-omong, dengan eclipse Anda dapat menggunakan Ctrl+ Shift+ Ountuk mengatur impor, tetapi Anda juga dapat mengkonfigurasi "pembersih" yang menangani hal-hal seperti itu (dan banyak lainnya) setiap kali Anda menyimpan file java.

Michael Zilbermann
sumber
hmm .. saya akan terkejut jika itu adalah perilaku .. saya tahu kelas tidak diinisialisasi (yaitu memanggil penginisialisasi statis) sampai penggunaan pertama, atau sampai mereka secara khusus diminta oleh custom loader. tetapi jika dengan "dimuat" yang Anda maksud hanya "membaca ke dalam memori tetapi tidak diproses" itu mungkin, meskipun saya meragukannya.
Kip
sebenarnya, setelah dipikirkan lebih lanjut, seharusnya cukup mudah untuk menguji. kompilasi kode dengan impor yang tidak digunakan, kemudian gunakan alat "dekompilasi" dan lihat apakah impor yang tidak digunakan masih ada atau tidak. jika tidak maka mereka akan dihapus oleh kompiler, atau mereka hanya ada di sana untuk kenyamanan programmer.
Kip
4
Di mana Anda membaca itu? Itu sepenuhnya dan sama sekali tidak benar , dan selalu begitu. Setiap kelas yang direferensikan oleh kode akan dimuat, tidak termasuk impor.
Marquis dari Lorne
0

Bagi saya, satu impor kelas yang tidak terpakai di kelas pengontrol membuat masalah kompilasi di Jenkins build setelah saya menghapus kelas yang diimpor selama pembersihan kode dan melakukan penghapusan di git tanpa menguji build di lokal.

Aakash Kedia
sumber