2011-06-08 29 views
9

可能重複:
Why is using a wild card with a Java import statement bad?在java中導入特定的包或帶有通配符的整棵樹會更好嗎?

現在,我使用了大量的java.util包:

import java.util.Calendar; 
import java.util.logging.ConsoleHandler; 
import java.util.logging.Level; 
import java.util.logging.LogRecord; 
import java.util.logging.Logger; 

難道是更有效地只是做:

import java.util.*; 

這是什麼性能/效率成本?它甚至重要嗎?請原諒我對這個問題的無知。

此外,這只是在黑暗中拍攝,但有沒有辦法爲整個項目導入包?這樣我就不需要按照每個班級重新導入它們了?這是我的第一個大型Java項目,所以我仍然在學習更多企業方面的東西。

回答

4

此外,您不能包括整棵樹。您可以導入列表削減到

import java.util.Calendar; 
import java.util.logging.*; 

import java.util.*; 

不會導入在java.util.logging包東西。對於Java編譯器,沒有子包。也不適用於VM(除了一些使用包結構作爲文件目錄結構的類加載器)。


而且,看來你是混合的概念類/接口(或類型)。 java.utiljava.util.logging是包,而java.util.Calendar,java.util.logging.Level等是類。

一個類型(類/接口)是你可以在你的程序中使用的東西,而一個包主要只是一個名字空間來放置類和接口。 (此外,它對可見性有一些影響。)

您可以直接在包中輸入單個類型(通過指定其名稱)或所有類型(通過指定包和.*)。 (您也可以通過使用通配符來導入類型中的所有嵌套類型,或僅爲了完整性導入類的所有靜態方法/字段,其格式爲import static <class>.*)。

導入永遠不會遞歸,通配符導入只有一個級別。 (你也不能使用import java.util.*.*導入日誌記錄類。)

7

這是導入細節的好習慣。 Eclipse爲你做這件事沒有任何工作 - 只需使用「組織導入」(按ctrl + shift + o windows或cmd + shift + o mac)。

原因是從來沒有任何混淆你正在加載哪些類。

+1

+1 @Bohemian ctrl + ** SHIFT ** + o。我冒昧地編輯你的答案。 – 2011-06-08 14:30:02

+0

@Alain - 感謝您的回覆。 Mac的捷徑也是錯的!這是轉移不選擇編輯。 – Bohemian 2011-06-08 23:04:34

2

導入通配符包可能會稍微減慢編譯速度,但對運行代碼的後續性能沒有影響。

雖然只導入你想要的類是首選。

1

我總是喜歡導入所有的東西。在我的項目中,它也是代碼約定,並且禁止在導入語句中使用通配符。

查看對此question的答案,原因很充分。

1

這是什麼性能/效率成本?

無。導入+短名稱到完全限定名稱在編譯時解析。

它甚至有問題嗎?

的排序。當您導入整個軟件包時,由於部分導入的軟件包可能會在將來的版本中增長,導致模糊的導入,因此您可以隨時面對將來的編譯錯誤。

此外,這只是在黑暗中拍攝,但有沒有辦法爲整個項目導入包?

不,如果你一次又一次地導入java.util, java.text以外的包,我會說這是一種反模式的惡臭。也許你的代碼庫中缺少抽象。 Facades和基類都可以減少對外部包的直接耦合和依賴關係。

相關問題