2015-10-07 85 views
2

在JAVA中,類名必須始終與文件名相同,但有時文件包含多個類。文件中只有單個類(或接口)可以是公共的,並且它必須與文件具有相同的名稱。但是,如果文件名具有多個不公開的類(或接口),那麼它是如何確定的?Java類命名規則

interface Foo {} 

class Bar{} 

有些人似乎混淆了這個問題

其實我知道,它會不顧工作,如果我選擇富或酒吧作爲文件名。然而,如果有某種類型的命名規則,我的興趣是什麼。

爲什麼我不把它命名爲我喜歡的東西?因爲我實際上正在編寫一個重構代碼的應用程序,並且每當它重新命名類時,我都需要知道如何以及何時更改我的文件名。

到目前爲止,我認爲正確的方法是:

如果類有一個公共節點,使用它的名稱作爲文件名, 否則隨便挑的第一個節點,所以在這個例子會贏。所以我簡化了這個問題:這是正確的方式,還是有更多的東西呢?

+3

測試一下,看看。 –

+0

您應該嘗試一下,編譯它,並查看.class文件的創建方式 – ControlAltDel

+0

它可以雙向工作,問題在於約定。 – Benedictus

回答

4

引用Java語言規範,第7.6節Top Level Type Declarations

當且僅當包存儲在文件系統(§7.2),主機系統可以選擇執行,這是限制一個編譯時錯誤如果一個類型不是在下類型名稱加上一個擴展名(如.java.jav)構成文件名的文件中找到,如果下面的任一爲真:

  • 的類型在聲明類型的包的其他編譯單元中由代碼引用。

  • 該類型聲明爲public(因此可以從其他包中的代碼進行訪問)。

此限制意味着每個編譯單元最多隻能有一個這樣的類型。這個限制使得Java編譯器可以輕鬆地在包中找到一個命名類。在實踐中,許多程序員選擇將每個類或接口類型放入其自己的編譯單元中,而不管它是否公開,或者是由其他編譯單元中的代碼引用。

所以,正如你所看到的那樣,「類名必須總是與文件名相同」並非如你所說的要求。

這只是一種簡單的方法,允許某些編譯器在編譯期間輕鬆找到類源代碼。

但是,更重要的是,它還幫助找到源代碼。如果您看到對類com.example.Foo的引用,則您確切知道在哪裏可以找到它,因爲它將在文件com/example/Foo.java中。

非公開(包私人)頂級類,可以在技術上放置在任何名稱的文件中,多個這樣的類可以捆綁在一個文件中,但這使得它們很難找到。爲此,我見過一個準則(不記得在哪裏)是說,你應該始終把頂級類在他們自己的文件,但有一個例外:

  • 如果非公共類是只有由另一個類使用,可以將它放在與其他類相同的編譯單元(.java文件)中。

基本上,這意味着你應該考慮任何頂級類,他的名字是不是文件名,爲「文件範圍」,即使它在技術上包範圍的。

1

有2個規律可循:

第1章:類可以有包(默認)或公衆知名度

第二個規則:你已經定義爲公衆必須德班可以用同名的.java源文件實現,但非公有類可以在源文件中使用其他名稱。

+0

請看我的編輯 – Benedictus

+0

@Benedictus: - 您應該始終遵循最佳實踐,最佳實踐是將每個類放入其自己的源文件中,而不管其可見性如何,除非公共類。對於想要通過簡單瀏覽文件夾並查找特定文件名來檢查類聲明的其他人來說,它非常方便。 –

+0

問題與如何**我應該寫我的課程無關,而是如何解析它們。 – Benedictus