2011-12-18 79 views
6

什麼是冗餘java import陳述的影響?Java中冗餘導入語句的影響是什麼?

它們是否影響編譯的運行時(性能/大小)? 或只是像intellisense的東西?

以不同的方式提問: 刪除它們有多重要?

+0

謝謝大家的意見。 這已經非常豐富。 我知道需要保持我的代碼清潔,以及何時何時不擔心性能。 這只是爲了增加教育。 我現在也覺得「多餘」這個詞在這裏是錯誤的選擇, 我的意思是一個不再需要的導入語句。 就好像你使用類似java.util.ArrayList的東西,然後改變你的代碼,使得這個類不再被使用。 如果導入語句仍然存在的事實會讓我的代碼變大或變慢,那麼我就在遊蕩。 – epeleg 2011-12-18 13:19:51

回答

14

導入語句僅影響編譯期間發生的情況。

編譯器獲取此代碼,並創建一個.class文件,該文件以可執行格式(二進制內容)表示您的代碼。

最後,二進制文件是完全一樣的,但它們的製作方法是不同的。

讓我們看一個簡單的例子:

import java.util.*; 

VS

import java.util.ArrayList; 
import java.util.List; 

在使用時:

//... 
List <String> someList = new ArrayList <String>(); 
//... 

當編譯器打字List,在第一種情況下,它需要確定List是否存在於該類集合中或不是。在第二種情況下,它已經明確給出,所以它更容易。

從本質上講,編譯器必須採用import語句中存在的所有類並記錄它們的名稱,以便如果使用它,編譯器可以檢索正在調用的相應函數。

有時,在多個包中有相同名稱的類。在這種情況下(Thomas所指的是)你不應該使用*來選擇目錄中的所有類。

明確描述您的班級使用情況是最佳做法。

1

最大的危險是命名空間衝突。例如,如果兩個導​​入的庫都有一個List類型,它可能不會使用您認爲的那個。

+5

這是不正確的。假設你想要導入'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

1

,因爲它們添加膨脹到.java文件,因爲在給定文件中擺脫他們的速度快,價格便宜,特別是如果你使用的是IDE刪除它們是非常重要的(CTRL - SHIFT - 我相信,這是Eclipse中的捷徑)。

至於「冗餘進口對機器有什麼作用」,好吧,實際上並不多。 本身只會被添加到相關的jar文件中,並且每個類只能加載一次(請參見「不同類別」的相關內容),所以除了增加一些微不足道的時間彙編,它不會對程序本身產生實質性的長期影響。

也就是說,解決這個問題便宜又容易:如果你不使用IDE,那麼你應該有明確的分組導入語句,這些語句有一些正常的開始(我的alphabetize我的意思是我會立即看到兩個進口java.util.Map,因爲它們彼此相鄰!)。如果你沒有修復它,你的同伴將會積極地進行編譯,所以我建議你這樣做對你最有利。

+0

該類本身只會加載一次,除非程序具有自定義類加載問題。 .eva文件中的'Bloat'甚至不準確。 'import javax.swing。*',在任何情況下,刪除它們都是非常重要的,這不是很重要的原因:你沒有給出任何其他的。 – EJP 2011-12-18 08:43:01

+1

@EJP這不完全準確。由於JVM如何加載類,多個引導加載程序很可能會多次加載相同的類。我承認我沒有完全解釋這是一個微妙之處,但這樣做似乎很尷尬和過分。 – cwallenpoole 2011-12-19 07:03:52

+0

多個*加載器*可能會每個加載一次類,我在我的評論中專門提供了這些特殊情況。 – EJP 2011-12-19 08:54:58

3

它不會影響性能以獲得額外的進口報表。它可能會使源代碼比應該更長,但對編譯後的代碼沒有影響。 Java本身進口不必要的類文件 - 看到Java Language Specificationsection 7.5.5

每個編譯單元自動導入的預定義的包java.lang中聲明的所有公共類型的 名字,彷彿 聲明:
import java.lang.*;
出現在每個 編制單位的開頭,緊隨任何包裝聲明。

Section 7.5.2

A型導入點播報關永遠不會導致任何其他聲明 被陰影。

......這意味着通配符導入不會勝過單進口導入。正如其他人指出的那樣,任何體面的IDE(NetBeans,Eclipse等)都會爲您刪除未使用的導入。

+0

它並不總是使源代碼更長。 'import javax.swing。*;'可能會導入大量未使用的類,但比明確導入程序使用的每個Swing小部件要短很多。 – 2011-12-18 08:15:48

+0

@泰德,是的,你是對的,我會修改我的答案。 – Paul 2011-12-18 08:20:11

2

與許多關於性能的問題一樣,代碼的清晰度通常更重要。這應該是你的第一個想法,只有在你遇到已知(測量)性能問題的罕見情況下,你才應該考慮不寫最簡單,最清晰的代碼。

像許多性能問題一樣,在這種情況下,最簡單,最清晰的代碼也是最快的。

您應該保持您的import或讓您的IDE保持它們,讓它們保持清晰並使您的代碼更易於維護。性能問題非常小,即使對於編譯器或IDE。