2011-03-29 53 views
6

爲什麼要使用包可見(默認),除非類應該用Java公共包可見

+1

讀一點背景會對你有幫助。 [用Java思考](http://www.mindview.net/Books/TIJ/)第5章。這已經全部寫完了。 – 2011-03-29 11:50:07

+1

對於接口,默認可見度是公共的。 ;) – 2011-03-29 11:54:31

回答

0

default修改即能得到什麼,沒有任何訪問修飾符(即公共私人或保護),這意味着它在一個特定的包中都可見。所以,當你想讓你的課程只能通過自己的包裝進行訪問時,你應該選擇default

瞭解更多:Controlling Access

3

我understaning是包/默認訪問是包裝內部,即類,不構成封裝接口,即不應在包的外部使用的類。

7

正如Rostislav Matl所說,它對於何時不想構成包的界面的一部分非常有用。

舉個例子,假設你有一個包,它提供了一個接口和至少一個服務的具體實現。

使用此服務的人會關心您提供的界面並使用您提供的某個具體類,但除此之外,他們不會關心其他任何內容。我們的服務必須與數據庫交談,並且它需要能夠將來自數據庫查詢的結果映射到它自己的數據類型(它形成它的合同)。

我發現我經常創建包含私有助手類的包含實用程序類型方法或執行類似我們需要的映射的任務。默認情況下(包私有)的可見性是完美的,因爲你的包內的其他類可以使用這些助手,但包外沒有人可以看到它們,所以你可以隨時更改它們,只要你喜歡。

這是一個使用一些代碼的例子:

我們有我們的界面:

public interface UsefulService { 
    Collection<DataThings> getThings(Identifier id); 
} 

...我們的具體實施:

public class JdbcUsefulServiceImpl implements UsefulService { 

    //We can break the code for the mapping out into its own class 
    private Mapper mapper; 

    @Override 
    public Collection<DataThings> getThings(Identifier id){ 
     DatabaseQueryResult queryResult = //Code to hit a database and return objects from that domain model 
     Collection<DataThings> result = mapper.mapFromDatabaseToServiceDomain(queryResult); 
     return result; 
    } 
} 

然後,我們有我們的映射。我們不需要任何人的包外關心服務內部的工作,所以我們使用包私有可見,當我們希望把工作做好,我們可以有很多類:

class Mapper { 
    Collection<DataThings> mapFromDatabaseToServiceDomain(DatabaseQueryResult queryResult){ 
     //magic to map objects goes here 
    } 
} 

,我們有益處是我們可以隨時改變這個Mapper類,但是我們想要或者刪除它或者創建新的包私有類,並且我們知道我們可以導致的唯一(立即)影響是在這個包內。即時效應是指編譯器錯誤和類似的嚴重事情。顯然,如果你改變了自己的行爲,那麼你可能會中斷你的服務,但這就是你的自動化測試套件所能抓住的:P