2011-04-17 25 views
0

我知道,Python和Ruby有該片段if __name__ == '__main__': if __FILE__ == $0,這將只運行如果腳本是直接打開運行。

這似乎是,我沒有在Java中看到一個非常有用的功能(我校的「官方」的編程語言)。在Java中是否有與此等價的東西?如果沒有,是否有任何方法來實現它?

回答

5

Java有public static void main(String[] args)方法。當一個類被作爲運行在命令行主類,這是調用,一般只這種情況下調用(你可以直接調用它,但它通常沒有意義)。所以,在java中,標準是在這個方法中放置「主要調用」邏輯。

+0

的'main'功能沒有被包括類作爲您的項目庫中調用僅。如果你想爲圖書館運行'main',你就不得不明確地調用它。 – 2011-04-17 22:35:54

0

獲取堆棧跟蹤,並看看第一種方法:

Throwable t = new Throwable(); 
StackTraceElement[] elems = t.getStackTrace(); 
... elems[elems.length-1] should contain a main method ... check if it is yours :) ... 
+0

換句話說,只要在你正在處理的任何文件中向類中添加一個名爲'main'的靜態方法。 – cam 2011-04-17 22:23:28

+0

但是,只有當您不啓動任何單獨的線程時纔有效。 – 2011-04-17 23:11:59

5

要添加到jthalborn's answer

真正的問題是不是?「我怎麼做到這一點在Java中」它是「爲什麼Ruby和Python需要這樣一個kludge?」

答案是,當文件加載時(無論是作爲庫還是作爲主程序),Ruby和Python都希望從頭到尾執行一個文件,因此您需要黑客說「不要運行這個部分如果我被稱爲圖書館「。 Java沒有從開始到結束運行文件或類的期望。它具有在其中包含的代碼,當該類別被用作主程序特定類一個main()。因此,Java不需要這種破解。 (C和C++在這方面與Java相似,但在程序中只能有一個main()函數,因此您需要求助於使用預處理器來決定編譯哪一個函數,或者您需要將不同的main()函數在不同的文件中,並且只能編譯你需要的文件。)

+2

我不想爲「kludge」/「hack」評論降低評分,但這是錯誤的。這是一個設計決策,有效地「執行」一個包含圖書館的內容會給你帶來有趣的可能性(你知道模塊初始化的確切順序/時刻)。人們也可以稱Java的模型爲黑客,因爲編譯期間必須使用可用的API。不同的方法!= kludge。 – viraptor 2011-05-31 12:27:52

相關問題