2009-04-08 22 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多个不同问题的编程竞赛解决方案。你有更好的组织吗?