Dağınıklığı azaltmak dışında, Java'da kullanılmayan içe aktarmaları temizlemek için herhangi bir neden var mı?


99

Java'da kullanılmayan içe aktarma ifadelerini önlemek için iyi bir neden var mı? Anladığım kadarıyla, derleyici için oradalar, bu nedenle kullanılmayan birçok içe aktarmanın derlenen kod üzerinde herhangi bir etkisi olmayacak. Sadece karmaşayı azaltmak ve sıradaki çatışmaları isimlendirmekten kaçınmak için mi?

(Eclipse, kullanılmayan içe aktarmalar hakkında bir uyarı verdiği için soruyorum, bu kod geliştirirken can sıkıcı bir durum çünkü sınıfı tasarlamayı bitirdiğimden oldukça emin olana kadar içe aktarmaları kaldırmak istemiyorum.)

Yanıtlar:


86

İthalatı kaldırmıyorsanız, performans sorunlarının veya buna benzer bir şeyin muhtemel olduğunu düşünmüyorum.

Ancak liste arayüzünü içe aktarmak gibi nadir durumlarda adlandırma çakışmaları olabilir.

Eclipse'de içe aktarmaları düzenlemek için her zaman bir kısayol (İşletim Sistemi - Win: Ctrl + SHIFT + Ove Mac'e bağlıdır COMMAND + SHIFT + O:) kullanabilirsiniz. Eclipse daha sonra ithal bölümünü temizler, tüm eski ithalleri kaldırır vb. İthal edilmiş bir şeye ihtiyacınız varsa, tekrar eclipse, siz ifadeyi tamamlarken bunları otomatik olarak ekleyecektir Ctrl + SPACE. Dolayısıyla, sınıfınızda kullanılmayan kod bulundurmaya gerek yoktur.

Her zaman olduğu gibi kullanılmayan kod, kodu okurken ve aktif kodunuzda bir şeyler bırakırken sizi ve diğer insanları rahatsız edecektir çünkü belki sonradan buna ihtiyacım olabilir, çoğunlukla kötü bir uygulama olarak görülür.


22
Aslında pencerelerde Ctrl + Shift + O'dur.
Matt Ball

1
Linux üzerinde Ctrl + Shift + O'ya basın. Muhtemelen BSD'de aynı.
WhyNotHugo

2
Organize ithalat eylemine ulaşmanın bir başka yolu da ctrl+3(en azından windwos'ta) tıklamak ve ardından içe aktarmalar yazmaktır. Açıkçası ctrl + shift + O'dan daha yavaştır, ancak bunun için belirli kısayolu hatırlamasanız bile onu hızlı bir şekilde bulmanın bir yoludur (ve hatırladığınız veya sadece bulmaya çalıştığınız diğer birçok eylem).
epeleg

53

Bunlardan biri, içeri aktarım tarafından referans verilen sınıfı sınıf yolundan kaldırırsanız, hiçbir amaca hizmet etmeyen aptalca bir derleyici hatası almazsınız. Ve "nerede kullanılır" araması yaptığınızda yanlış pozitifler almazsınız.

Bir diğeri (ancak bu, doğası gereği çok spesifik olacaktır), kullanılmayan içe aktarmanın başka bir içe aktarmayla adlandırma çakışmaları olması ve gereksiz yere tam nitelikli adları kullanmanıza neden olması olabilir.

Ek: Bugün, yapı sunucusu yetersiz bir bellek hatasıyla derlemede başarısız olmaya başladı (test bile çalıştırılmadı). Sonsuza kadar iyi çalıştı ve check-in'lerin yapım sürecinde herhangi bir değişiklik veya bunu açıklayabilecek önemli eklemeler yoktu. Bellek ayarlarını (64 bitlik bir CentOS üzerinde 64 bit JVM çalıştırıyor!) İstemcilerin derleyebileceği yerin çok ötesinde bir şeye yükseltmeye çalıştıktan sonra, kontrolleri tek tek inceledim.

Bir geliştiricinin kullandığı ve terk ettiği uygunsuz bir içe aktarma vardı (sınıfı kullandılar, otomatik olarak içe aktardılar ve sonra bunun bir hata olduğunu anladılar). Bu kullanılmayan içe aktarma, uygulamanın tamamen ayrı bir katmanına çekildi, IDE bunları ayırmak için yapılandırılmamışken, oluşturma işlemi. Bu tek içe aktarma o kadar çok sınıfa sürüklendi ki, derleyici sınıf yolunda ilgili bağımlı kitaplıklara sahip olmadan derlemeye çalıştı ve bu, bellek yetersiz hatasına neden olacak kadar çok soruna neden oldu. Kullanılmayan bir ithalattan kaynaklanan bu sorunu çözmek bir saat sürdü.


4
@Yishai, Eclipse kullanıyorsanız, her kaydettiğinizde kaynak kodunu normalleştirebilen Kaydetme Eylemlerine bakın.
Thorbjørn Ravn Andersen

2
@EJP, sonuçta oluşan bayt kodunu etkilemese de, derleyicinin oluşturması gereken bayt kodunu anlamak için bunları çözmesi gerekir.
Yishai

3
@EJP, tüm ek derleme süresinden bahsediyor ("derleme sunucusu derlemede başarısız olmaya başladı").
Yishai

1
Hala ithalatın tek başına tüm bunlara neden olabileceğini anlamıyorum?
Thorbjørn Ravn Andersen

1
@Yishai Üzgünüm ama buna inanmıyorum. Bunu yanlış teşhis ettin. Sınıf gerçekten kullanılmadığı sürece içe aktarmanın böyle bir etkisi olmamalıdır. Tüm import deyiminin yaptığı, derleyiciye o sınıfın hangi paketin içinde olduğunu söylemektir. Derleyici, yalnızca o sınıf hakkında tür bilgisine ihtiyaç duyduğunda dolaylı olarak derlemeye çalışır.
Marquis of Lorne

9

Sade bir bakış açısına göre, herhangi bir bağımlılık ürün üzerinde bir "kısıtlamadır" ve bu nedenle daha sonra bakım sorunlarına neden olabilir.

Örneğin, programınızın com.XYZObjectPool sınıfını kullandığını ve daha sonra onu kullanmamaya karar verdiğinizi ancak içe aktarmayı asla kaldırmayacağınızı varsayalım. Şimdi başka biri org.WVYObjectPool'u somutlaştırmak istiyorsa ve sadece ObjectPool'a başvurmak isterse, satırın aşağısında bir döküm sorunu veya çağırma sorunu olana kadar bu konuda herhangi bir uyarı almazlar.

Bu arada bu gerçekçi olmayan bir senaryo değil. Eclipse'e her seferinde hangi belirli X sürümünü içe aktarmak istediğinizi sorduğunuzda ve birçok paket arasından birini seçtiyseniz, içe aktarmayı orada yapmış olsaydınız, bilmeden yanlış seçim yapmış olabileceğiniz bir senaryo.

Her iki durumda da Eclipse'den bunları sizin için temizlemesini isteyebilirsiniz.


3

Uyarı? Eclipse'den onları sizin için otomatik olarak temizlemesini isteyin. IntelliJ'in yaptığı bu. Sizi uyaracak kadar akıllıysa, onları temizleyecek kadar akıllı olmalıdır. Böyle bir dırdırı bırakıp bir şeyler yapmasını söylemek için bir Eclipse ayarı aramanızı tavsiye ederim.


4
Bu Eylemleri Kaydeder. Şahsen ben, Eclipse'in kodunuzu yalnızca siz açıkça istediğinizde değiştirmesini seviyorum.
Thorbjørn Ravn Andersen

1
@ Thorbjørn: Kabul edildi, özellikle de bir süredir kullanmayı bıraktığım ama kısa süre sonra tekrar eklemeyi umduğum bir sınıfsa.
Donal Fellows

2
@Donal, işte Ctrl-Space bunun için.
Thorbjørn Ravn Andersen

3

Bunun, bakım için yararlı olan programın netliği ile ilgisi vardır.

Bir programı sürdürmeniz gerekiyorsa, satır başına tek bir sınıf içeri aktarmanın ne kadar yararlı olduğunu göreceksiniz.

Aşağıdaki senaryoyu düşünün:

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
     }
 }

Kod parçasında hata giderirken veya bakımını yaparken (veya yalnızca okurken), okuyucunun kullanılan sınıfların hangi pakete ait olduğunu bilmesi çok yararlıdır. Yukarıda gösterildiği gibi joker karakter içe aktarmanın kullanılması bu amaca yardımcı olmaz.

Bir IDE ile bile, bildirimde bulunmak ve geri dönmek istemezsiniz, işlevsellik açısından mevcut kodun diğer paketlerin ve sınıfların neye bağlı olduğunu anlarsanız daha kolaydır.

Bu kişisel bir proje veya küçük bir şey içinse, gerçekten önemli değil, ancak diğer geliştiriciler tarafından kullanılması gereken (ve yıllar boyunca sürdürülmesi gereken) daha büyük bir şey için bu OLMALIDIR.

Hiçbiriyle kesinlikle performans farkı yoktur.


3

Bilginize, Bu beni yakaladı, ithalatı organize etmenin kullanılmayan ithalatı gerçekten kaldırdığını düşünmediğim için, sadece onları sıraladığını düşündüm.

Bir kaydetme işlemi sırasında içe aktarmaların otomatik olarak kaldırılması, örneğin geliştirme veya test sırasında bir sorununuz olduğunda ve bazı kodları yorumladığınızda, kaydettiğinizde, kodun yorumlanmış bölümü tarafından kullanılan içe aktarmalar kaldırıldığında bana biraz üzüldüm. Bazen değişiklikleri geri alabileceğiniz ( Ctrl+ Z) için bu bir sorun değildir , ancak diğer zamanlarda başka değişiklikler yapmış olabileceğiniz kadar basit değildir. Ayrıca, kodu yorumlamadığımda (daha önce yorum yaptıktan sonra kaydettiğimde, bu kod için içe aktarımları kaldırarak) otomatik olarak gerekli olan içe aktarmaları tahmin etmeye çalışıp yanlış olanları aldığımda da bir sorun yaşadım (örneğin, sanırım StringUtilskullanılan bir sınıf vardı ve yanlış kitaplıktan aynı ada sahip başka bir sınıf seçti).

Bir kaydetme işlemi yerine içe aktarmaları manuel olarak düzenlemeyi tercih ediyorum.


2

Tutulma için şunu kullanıyorum: pencere -> tercihler -> java -> düzenleyici -> eylemi kaydet -> içe aktarmaları organize etmek için onay kutusunu işaretleyin (orada da biçimlendirme, alanları sonlandırma vb. Gibi birçok yararlı şey var. .). Bu yüzden dosyamı kaydettiğimde tutulma benim için gereksiz ithalatları kaldırıyor. Benim fikrime göre, bir şeye ihtiyacınız yoksa onu kaldırın (veya tutulma ile kaldırılmasına izin verin).


2

Kullanılmayan ithalat ifadelerini yorumlayabilirsiniz ve uyarılar sizi rahatsız etmeyecektir, ancak sahip olduklarınızı görebilirsiniz.


2
@DimaSan Aslında öyle: soru , sınıfı tasarlamayı bitirdiğimden oldukça emin olana kadar ithalatı kaldırmak istemediğimi
The Vee

1

Herhangi bir performans etkisi yoktur, ancak okunabilirlik için onu temizleyebilirsiniz. Kullanılmayan ithalatları kaldırmak hem Eclipse hem de IntelliJ IDEA'da oldukça basittir.

Tutulma

Windows / Linux -    Ctrl+ Shift+O

Mac -                        Cmd+ Shift+O

IntelliJ IDEA veya Android Studio

Windows / Linux -    Ctrl+ Alt+O

Mac -                        Cmd+ Alt+O


0

Birkaç yıl önce bir yerde, içe aktarılan her sınıfın çalışma zamanında içe aktarılan sınıfla yükleneceğini okudum. Bu nedenle kullanılmayan, özellikle de tüm paketlerin kaldırılması bellek ek yükünü azaltacaktır. Java'nın modern sürümlerinin bununla ilgilendiğini düşünmeme rağmen, muhtemelen bu artık bir sebep değil.

Ve bu arada, tutulmada Ctrl+ Shift+ kullanabilirsinizO içe aktarmaları düzenlemek , ancak bir java dosyasını her kaydettiğinizde bu tür şeylerle (ve diğer pek çok şeyle) ilgilenen bir "temizleyici" de yapılandırabilirsiniz.


hmm .. Davranış buysa şaşırırdım .. Sınıfların ilk kullanıma kadar veya özel bir yükleyici tarafından özellikle talep edilene kadar başlatılmadığını (yani statik başlatıcıları çağırarak) biliyorum. ancak "yüklü" derken "hafızaya oku ama işlenmedi" demek istiyorsan, bu mümkün, ancak bundan şüphem var.
Kip

aslında, daha fazla düşünüldüğünde, test etmesi oldukça kolay olmalı. kullanılmamış içe aktarmalarla kod derleyin, ardından bir "derlemeyi çözme" aracı kullanın ve kullanılmayan içe aktarmaların hala orada olup olmadığına bakın. değilse, ya derleyici tarafından kaldırılırlar ya da programcıya kolaylık sağlamak için oradadırlar.
Kip

4
Bunu dünyanın neresinde okudun? Öyle kesinkes yanlış ve her zaman olmuştur. Kod tarafından referans verilen her sınıf , içe aktarmalar dahil değil yüklenecektir .
Marquis of Lorne

0

Benim için, kod temizleme sırasında içe aktarılan sınıfı sildikten ve yerelde bir yapıyı test etmeden git'te silme işlemini gerçekleştirdikten sonra, bir denetleyici sınıfındaki kullanılmayan bir sınıf içe aktarma, Jenkins derlemesinde bir derleme sorunu yarattı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.