2009-04-08 20 views
35

我和我的一位朋友進行了很長時間的討論,討論了Java中主要方法的正確使用方法。基本上我們有這樣的一個類:Java主要方法,良好的編碼風格

public class AnImporter implements Runnable { 
    // some methods, attributes, etc. 
} 

但是主要的方法在哪裏?我海外商品會有它一個很好的做法,以「保持代碼,它屬於」,從而把上面的代碼放到

public class AnImporter implements Runnable { 
    public static void main(String [] args){ 
    // Startup code for Importer App here 
    } 
    // some methods, attributes, etc. 
} 

雖然我的朋友認爲,「啓動代碼無關應用程序本身」,因此它應該被放置在另一個類,如下所示:

public class AnImporter implements Runnable { 
    // some methods, attributes, etc. 
} 

public class AnApplication { 
    // Nothing here 
    public static void main(String [] args){ 
    AnImporter a = new AnImporter(); 
    // Startup code here 
    } 
    // Nothing here 
} 

儘管我們討論過這個問題了一段時間,我們都結束了沒有定論哪個方法是在Java中更好的辦法的事實。你對這個主題有什麼看法?在哪裏以及最重要的是,爲什麼,你把你的主要方法放在哪裏?

+0

您需要問自己:爲什麼(或爲什麼不)主要方法屬於該類? – 2011-11-28 13:01:26

回答

35

我同意你的朋友。您正在AnImporter中構建一個潛在的可重用服務,可能用於多個主程序的多個程序。因此,製作一個主要特色並將其嵌入到AnImporter中沒有多大意義。

11

我不會用主要方法污染Runnable類。幾乎任何在您的應用程序中執行任何操作的類都是如此。一般來說,我就會有這樣一類:

public class App { 
    public static void main(String args[]) { 
    Thread t = new Thread(new Blah()); 
    t.start(); 
     synchronized (t) { 
     t.wait(); 
     } 
    } 
} 

public class Blah implements Runnable { 
    public void run() { 
    // do normal stuff 
    } 
} 

代替:

public class Blah implements Runnable { 
    public void run() { 
    // do normal stuff 
    } 

    public static void main(String args[]) { 
    Thread t = new Thread(new Blah()); 
    t.start(); 
    synchronized (t) { 
     t.wait(); 
    } 
    } 
} 

我就覺得乾淨。

14

我可能會和你的朋友一起去,因爲我希望儘快用主要方法離開課堂。當你想自動測試(只是可運行的類)或者你想嘲笑事情時,它有助於促進測試。您越早離開主要方法,就有更多的選擇。如果你有一個主要方法和其他東西在其中,它可能會很快變得混亂。 (即使它可能看起來並不像這樣一個簡單的例子)

但我會說可讀性和可測試性是離開主要方法(及其包含類)的兩個很好的理由儘快。但hey..that只是我;)

+1

是的。我也會盡快離開Applet/JApplet。 – 2009-04-09 00:00:02

7

我總是分開主要從代碼的其餘部分,有以下幾個原因:

1)主要是,從某種意義上說,黑客攻擊,讓你的程序開始從命令行。任何包含它的類都應該有一個單獨的責任:讓程序從命令行啓動。通過將它放在主要可運行模式中,您正在污染可運行的應用程序。

2)你可能最終具有多個電源(例如,具有特定的默認參數,特別模式等)

3)你可能最終從不同的環境中運行的程序(例如,一個Eclipse插件或OGSI模塊,小應用程序,基於web的工具等)。在這些情況下,你會想限制訪問你的主。把它與功能,防止這一點。

4)有時候更容易讓你的主程序在默認包中更快地運行(例如,java myblabla par1 par2 par3),但你絕對不希望你的代碼的其餘部分放在默認包中。

+0

+ +1是一個很好的答案,但我會說,一個人不應該把任何類放在「默認」包中,甚至沒有任何類放在main中。 – 2009-04-09 07:11:14

2

主要接口(字符串列表)幾乎沒用,除了OS shell。

你的主要應該儘可能少的代碼人爲可能。

確實,你的public class ThisIsMyApp {...}應該不過是操作系統的接口,而不是真正的工作,這是其他地方。

0

我會從代碼中分離主要方法。

雖然我也有不同類型的項目。它不包含解決方案的實際工作計劃。在這裏,我需要針對使用(和開發)相同庫的不同問題運行不同的解決方案。不同的問題並不平行。我需要從我的IDE中單獨運行一個問題。我發現使用PSVM方法的大量類的同一個項目很方便。

該項目包含400多個不同問題的編程競賽解決方案。你有更好的組織嗎?