什麼是冗餘java import
陳述的影響?Java中冗餘導入語句的影響是什麼?
它們是否影響編譯的運行時(性能/大小)? 或只是像intellisense的東西?
以不同的方式提問: 刪除它們有多重要?
什麼是冗餘java import
陳述的影響?Java中冗餘導入語句的影響是什麼?
它們是否影響編譯的運行時(性能/大小)? 或只是像intellisense的東西?
以不同的方式提問: 刪除它們有多重要?
導入語句僅影響編譯期間發生的情況。
編譯器獲取此代碼,並創建一個.class
文件,該文件以可執行格式(二進制內容)表示您的代碼。
最後,二進制文件是完全一樣的,但它們的製作方法是不同的。
讓我們看一個簡單的例子:
import java.util.*;
VS
import java.util.ArrayList;
import java.util.List;
在使用時:
//...
List <String> someList = new ArrayList <String>();
//...
當編譯器打字List
,在第一種情況下,它需要確定List
是否存在於該類集合中或不是。在第二種情況下,它已經明確給出,所以它更容易。
從本質上講,編譯器必須採用import
語句中存在的所有類並記錄它們的名稱,以便如果使用它,編譯器可以檢索正在調用的相應函數。
有時,在多個包中有相同名稱的類。在這種情況下(Thomas所指的是)你不應該使用*
來選擇目錄中的所有類。
明確描述您的班級使用情況是最佳做法。
最大的危險是命名空間衝突。例如,如果兩個導入的庫都有一個List類型,它可能不會使用您認爲的那個。
這是不正確的。假設你想要導入'List'並導入'java.awt.List'和'java.util.List',編譯器會抱怨第二個,因爲你已經有一個單一類型的'List'導入。如果您導入'java.awt。*'和'java.util。*',編譯器將因爲對List的模糊引用而失敗。實現您的方案的唯一方法是如果您導入一個單一類型和一個通配符,例如'java.awt。*'和'java.util.List' - 單一類型將受到青睞。請參閱Java語言規範[第7.5.1節](http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5。1) – Paul 2011-12-18 07:00:45
,因爲它們添加膨脹到.java
文件,因爲在給定文件中擺脫他們的速度快,價格便宜,特別是如果你使用的是IDE刪除它們是非常重要的(CTRL - SHIFT - 我相信,這是Eclipse中的捷徑)。
至於「冗餘進口對機器有什麼作用」,好吧,實際上並不多。 類本身只會被添加到相關的jar
文件中,並且每個類只能加載一次(請參見「不同類別」的相關內容),所以除了增加一些微不足道的時間彙編,它不會對程序本身產生實質性的長期影響。
也就是說,解決這個問題便宜又容易:如果你不使用IDE,那麼你應該有明確的分組導入語句,這些語句有一些正常的開始(我的alphabetize我的意思是我會立即看到兩個進口java.util.Map
,因爲它們彼此相鄰!)。如果你沒有修復它,你的同伴將會積極地進行編譯,所以我建議你這樣做對你最有利。
該類本身只會加載一次,除非程序具有自定義類加載問題。 .eva文件中的'Bloat'甚至不準確。 'import javax.swing。*',在任何情況下,刪除它們都是非常重要的,這不是很重要的原因:你沒有給出任何其他的。 – EJP 2011-12-18 08:43:01
@EJP這不完全準確。由於JVM如何加載類,多個引導加載程序很可能會多次加載相同的類。我承認我沒有完全解釋這是一個微妙之處,但這樣做似乎很尷尬和過分。 – cwallenpoole 2011-12-19 07:03:52
多個*加載器*可能會每個加載一次類,我在我的評論中專門提供了這些特殊情況。 – EJP 2011-12-19 08:54:58
它不會影響性能以獲得額外的進口報表。它可能會使源代碼比應該更長,但對編譯後的代碼沒有影響。 Java本身進口不必要的類文件 - 看到Java Language Specificationsection 7.5.5:
每個編譯單元自動導入的預定義的包java.lang中聲明的所有公共類型的 名字,彷彿 聲明:
import java.lang.*;
出現在每個 編制單位的開頭,緊隨任何包裝聲明。
A型導入點播報關永遠不會導致任何其他聲明 被陰影。
......這意味着通配符導入不會勝過單進口導入。正如其他人指出的那樣,任何體面的IDE(NetBeans,Eclipse等)都會爲您刪除未使用的導入。
它並不總是使源代碼更長。 'import javax.swing。*;'可能會導入大量未使用的類,但比明確導入程序使用的每個Swing小部件要短很多。 – 2011-12-18 08:15:48
@泰德,是的,你是對的,我會修改我的答案。 – Paul 2011-12-18 08:20:11
與許多關於性能的問題一樣,代碼的清晰度通常更重要。這應該是你的第一個想法,只有在你遇到已知(測量)性能問題的罕見情況下,你才應該考慮不寫最簡單,最清晰的代碼。
像許多性能問題一樣,在這種情況下,最簡單,最清晰的代碼也是最快的。
您應該保持您的import
或讓您的IDE保持它們,讓它們保持清晰並使您的代碼更易於維護。性能問題非常小,即使對於編譯器或IDE。
謝謝大家的意見。 這已經非常豐富。 我知道需要保持我的代碼清潔,以及何時何時不擔心性能。 這只是爲了增加教育。 我現在也覺得「多餘」這個詞在這裏是錯誤的選擇, 我的意思是一個不再需要的導入語句。 就好像你使用類似java.util.ArrayList的東西,然後改變你的代碼,使得這個類不再被使用。 如果導入語句仍然存在的事實會讓我的代碼變大或變慢,那麼我就在遊蕩。 – epeleg 2011-12-18 13:19:51