Effective Java 3rd 條目25 將源文件限制在單個頂層類

雖然Java編譯器讓你在單個源文件中定義多個頂層類,但是這么做沒有任何益處。危險性來自這個事實:在單個源文件中定義多個頂層類,使得為一個類提供多個定義變得可能贪染。使用哪個定義,受傳遞到編譯器的源文件順序的影響催享。

為了使得這具體些杭隙,考慮如下源文件,它僅僅包含了一個Main類因妙,這個類引用另外兩個頂層類(Utensil和Dessert)的成員:

public class Main { 
    public static void main(String[] args) { 
        System.out.println(Utensil.NAME + Dessert.NAME); 
    } 
}

現(xiàn)在假設(shè)你在命名為Utensil.java的單個源文件中痰憎,同時定義Utensil和Dessert:

// 同個文件中定義了兩個類。永遠不要這么做! 
class Utensil { 
    static final String NAME = "pan"; 
}

class Dessert { 
    static final String NAME = "cake"; 
}

當(dāng)然攀涵,主程序打印了pancake铣耘。

現(xiàn)在假設(shè)你恰巧在命名為Dessert.java的另外一個源文件中,定義了相同的兩個類:

// 同個文件中定義了兩個類以故。永遠不要這么做! 
class Utensil { 
    static final String NAME = "pot"; 
}

class Dessert { 
    static final String NAME = "pie"; 
}

如果你足夠幸運用命令javac Main.java Dessert.java編譯這個程序蜗细,那么編譯會失敗,而且這個編譯器將會告訴你:你已經(jīng)多次定義了Utensil and Dessert類。確實如此炉媒,因為編譯器將會編譯 Main.java踪区,而且當(dāng)它看見Utensil(它早于Dessert的引用)的引用,它將在Utensil.java中尋找這個類吊骤,然后發(fā)現(xiàn)了Utensil和Dessert缎岗。當(dāng)編譯器遇見了命令行上的Dessert.java,它也將引入這個文件白粉,這造成了它同時遇見了Utensil和Dessert传泊。

如果你使用命令javac Main.java或者javac Main.java Utensil.java編譯這個程序,它表現(xiàn)為你編寫Dessert.java文件之前的行為鸭巴,即打印pancake眷细。但是如果你使用javac Dessert.java Main.java編譯這個程序,它將打印potpie奕扣。因此這個程序的行為受到源文件傳遞到編譯器順序的影響薪鹦,這是明顯不可接受的掌敬。

解決這個問題惯豆,就像分解這個頂層類(在我們例子情形中,Utensil和Dessert)到不同的源文件這么簡單奔害。如果你很想把多個頂層類放置到單個文件中楷兽,考慮使用靜態(tài)成員類(條目24)作為分解類到不同源文件的替代方法。如果類從屬于另外一個類华临,把他們變成靜態(tài)成員類通常是更好的替代方法芯杀,因為它增強了可讀性,而且通過聲明這個類為私有來減少類的可訪問性(條目15)雅潭。以下是使用靜態(tài)成員類我們的例子看上去的樣子:

// 靜態(tài)成員類而不是多個頂層類
public class Test {
    public static void main(String[] args) { 
        System.out.println(Utensil.NAME + Dessert.NAME); 
    }

    private static class Utensil { 
        static final String NAME = "pan"; 
    }

    private static class Dessert { 
        static final String NAME = "cake"; 
    }
}

這堂課是明顯的:永遠不要把多個頂層類或者接口放到單個源文件中揭厚。遵從這個規(guī)則保證你不會在編譯時單個類有多個定義。這轉(zhuǎn)而保證扶供,編譯產(chǎn)生的類文件和最終程序的行為筛圆,是獨立于源文件傳入編譯器的順序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椿浓,一起剝皮案震驚了整個濱河市太援,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扳碍,老刑警劉巖提岔,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笋敞,居然都是意外死亡碱蒙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門夯巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赛惩,“玉大人巧还,你說我怎么就攤上這事》唤眨” “怎么了麸祷?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褒搔。 經(jīng)常有香客問我阶牍,道長,這世上最難降的妖魔是什么星瘾? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任走孽,我火速辦了婚禮,結(jié)果婚禮上琳状,老公的妹妹穿的比我還像新娘磕瓷。我一直安慰自己,他們只是感情好念逞,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布困食。 她就那樣靜靜地躺著,像睡著了一般翎承。 火紅的嫁衣襯著肌膚如雪硕盹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天叨咖,我揣著相機與錄音瘩例,去河邊找鬼。 笑死甸各,一個胖子當(dāng)著我的面吹牛垛贤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趣倾,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼聘惦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誊酌?” 一聲冷哼從身側(cè)響起部凑,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碧浊,沒想到半個月后涂邀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡箱锐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年比勉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩聋,死狀恐怖观蜗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衣洁,我是刑警寧澤墓捻,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坊夫,受9級特大地震影響砖第,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜环凿,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一梧兼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧智听,春花似錦羽杰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至环肘,卻和暖如春欲虚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悔雹。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣喧,地道東北人腌零。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像唆阿,于是被迫代替她去往敵國和親益涧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法驯鳖,類相關(guān)的語法闲询,內(nèi)部類的語法,繼承相關(guān)的語法浅辙,異常的語法扭弧,線程的語...
    子非魚_t_閱讀 31,641評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)记舆,斷路器鸽捻,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 我算是韓寒的粉絲了,一直以來比較喜歡他的文字風(fēng)格和處世態(tài)度,看《后會無期》的時候是大三暑假在北京實習(xí)御蒲,當(dāng)時和同班同...
    杰米心理閱讀 451評論 0 2
  • 我如果愛你—— 絕不像攀援的凌霄花衣赶, 借你的高枝炫耀自己: 我如果愛你—— 絕不學(xué)癡情的鳥兒, 為綠蔭重復(fù)單調(diào)的歌...
    斐恩閱讀 267評論 0 0
  • “聽君一席話厚满,勝讀十年書”是我這次上完標題課的最大體會府瞄,一個簡單的標題被弗蘭克老師分成了八種常見類型,如直言式碘箍,暗...
    smellfish999閱讀 192評論 0 0