2011-12-06 53 views
3

可能重複:
Why is using a wild card with a Java import statement bad?完整軟件包導入*和指定的類導入java之間的區別?

例。 1

import javax.swing.* 

JFrame f = new JFrame() 

Ex。 2

import javax.swing.JFrame 

JFrame f = new JFrame() 

在適應2)而不是1)中是否有任何效率增益(即使是最細微的和最小的)? java如何在內部引用包?在第一次編譯器遇到單詞JFrame時,我認爲它應該在完整的swing中搜索JFrame。*在1)情況下的包。否則,如果情況2),它可能會得到類直接通過一些索引或可能是關鍵值散列?那麼爲什麼這不被認爲是效率增益,即使它很小? (請糾正我,如果我對內部推定是錯誤的)

編輯:

對不起,重複..答案在Why is using a wild card with a Java import statement bad?

+1

那麼正如在許多答案中的一個所述,它凌亂你的本地命名空間(http://stackoverflow.com/questions/147454/why-is-using-a-wild-card-with-a-java-進口語句壞)。 – Pieter

回答

7

在Java中使用import javax.swing。* 和import javax.swing.JFrame沒有運行時間損失。唯一不同的是在編譯時,導入包*將搜索整個包以找到正確的類的信息。

單一類型導入(例如,import javax.swing.JFrame)增加了程序的可讀性,它將非常清楚哪些類已被使用。

Type-Import-on-Demand(例如import javax.swing。*)會導致編譯單元的類和接口聲明中的javax.swing包中聲明的所有公共類型的簡單名稱都可用。

1

第一個將加載在包中的所有類在編譯時

Ex : 1 

import javax.swing.* 

JFrame f = new JFrame() 

第二將加載僅在編譯時

Ex: 2 

import javax.swing.JFrame 

JFrame f = new JFrame() 
指定的類

如果使用第一種方法,它會增加編譯時間

+0

我也認爲增加編譯時間的機會很小,但是使用javax.swing.JFrame或javax.swing。*(以及其他幾個通配符導入)進行編譯測試時,我無法獲得任何統計重要數據。 –

-1

是的。

import javax.swing.* 

導入此包中的所有類。

import javax.swing.JFrame 

只進口JFrame類。

我會建議導入具體的類。 關心!

+0

這應該不會影響性能(可能會擴大編譯器搜索所需的名稱空間,因此編譯可能稍微延長一點)。這只是爲了方便。 –

+0

我在這可能不正確,但我相信*這隻會將*名稱導入到您的名稱空間*中。編譯器將此用於構建時名稱解析。在運行時,完整的類名包含在你的'.class'文件中,而不管這些類是否被實際使用。所以,雖然軟件維護偏好方面存在問題,但明顯的命名空間「混亂」,它應該對最終的二進制文件沒有影響。 – BRFennPocock

+0

我不認爲它對性能有任何影響。 – Russell

0

它在編譯時有性能問題,正如其他人所說的(考慮到當前計算機的處理能力可能不太重要)。即導入*使編譯器需要查看整個包,而導入特定類允許編譯器直接讀取它。但它在運行時不會導致任何性能問題,因爲編譯後所有類都將由編譯器正確鏈接。

它也與可讀性有關。如果我們import javax.swing.*,我們很難知道包javax.swing中正在使用哪些類。我們需要閱讀該程序才能找到它。但是,如果我們導入諸如import javax.swing.JFrame之類的特定類,它將幫助讀者理解僅從外部包中使用指定的類。在這裏,我們知道只有JFrame從包javax.swing使用,而不讀整個程序。即可以通過查看導入部分輕鬆找到我們的程序所需的依賴關係。

另一個問題是您可能會遇到命名衝突。例如,如果您執行兩個導入import com.abc.*import com.xyz.*。現在,假設這兩個軟件包都包含一個名爲SomeClass的類。然後,它將編譯器置於哪個SomeClass導入模糊的情況下,從而導致編譯時錯誤。

1

星號只是一種方便,所以你作爲程序員不必寫大量的導入語句。星號符號將包括作爲編譯候選者的特定包的所有類。

請注意,在大多數情況下,具體是首選,因爲它會清楚地表達你的意圖。此外,現代IDE將會爲您執行單調乏味的導入語句。所以在某種程度上,您可以考慮使用明星符號而不是過時。

0

除此之外,實施例2更明確,因此更清楚,它也更穩定/兼容。

E.g.考慮

import java.awt.*; 
import java.util.*; 

... 

List list; 

在預收集日。如果你使用帶有集合的jdk版本運行相同的代碼,編譯器會抱怨,因爲它不知道使用哪個List。

正如其他人所說,IDE將幫助您組織進口報表。