Java主要方法,良好的编码风格

我和我的一位朋友讨论了Java中主要方法的正确使用。 基本上我们有这样的一个class级:

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 } 

尽pipe事实上我们已经讨论了这个问题一段时间,但是我们最终都没有得出结论,哪个方法是更好的方法。 你对这个话题有什么看法? 在哪里,最重要的是,为什么你把你的主要方法放在哪里?

我同意你的朋友。 您正在AnImporter中构build一个潜在的可重用服务,可以在多个主程序的多个程序中使用。 所以,制作一个主要的特性并将其embedded到input器中是没有多大意义的。

我可能会和你的朋友一起去,因为我希望尽快用主要方法离开课堂。 它有助于简化testing,当你想要自动testing(只是可运行的类),或者你想嘲笑的东西。 越早离开主要方法,你有更多的select。 如果你有一个主要方法和其他的东西在其中,它可能会很快凌乱。 (即使可能看起来并不像这样一个简单的例子)

但是我认为可读性和可testing性是尽快摆脱主要方法(及其包含类)的两个很好的理由。 但是,嘿,这只是我;)

我不会用主要方法污染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(); } } } 

它只是感觉更干净。

我总是将代码与其他代码分开,原因如下:

1)在某种程度上,主要是让程序从命令行启动。 任何包含它的类都应该有一个单独的责任:让程序从命令行开始。 通过把它放在主要的可运行的,你正在污染可运行。

2)最终可能有多个电源(例如,某些默认参数,特殊模式等)

3)您可能最终从不同的环境(例如,Eclipse插件或OGSI模块,小应用程序,基于Web的工具等)运行程序。 在这些情况下,你会想限制访问你的主。 把它与function,防止这一点。

4)在默认包中保留main可以使运行时更快执行(例如java myblabla par1 par2 par3),但是你绝对不希望剩下的代码放在默认包中。

主要的接口(一个string列表)几乎没有用,除了OSshell。

你的主应该尽可能less的代码。

事实上,你的public class ThisIsMyApp {...}应该不过是操作系统的接口,而不是其他地方的真正的工作。

我会从代码中分离出主要的方法。

虽然我也有不同types的项目。 它不包括解决scheme的实际工作程序。 在这里,我需要针对使用(和开发)同一个库的不同问题运行不同的解决scheme。 不同的问题是不平行的。 我需要从我的IDE单独运行一个单独的问题。 我发现使用与PSVM方法相同的大量类的项目很方便。

这个项目包含400多个不同问题的编程竞赛解决scheme。 你有更好的组织吗?