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

kry*_*oko 36 java coding-style

我和我的一个朋友讨论过在Java中正确使用main方法的问题.基本上我们有这样一个类:

public class AnImporter implements Runnable {
  // some methods, attributes, etc.
}
Run Code Online (Sandbox Code Playgroud)

但在哪里放主要方法?我认为将代码保留在其所属的位置是一种很好的做法,从而将上述代码转换为

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

虽然我的好友认为"启动代码与应用程序本身无关",但它应该放在另一个类中,如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

尽管我们讨论了这个问题已经有一段时间了,但我们最终都没有得出结论,哪种方式是Java中更好的方法.你对这个话题有什么看法?在哪里,最重要的是,为什么,您将主要方法放在放置它的位置?

Cli*_*ler 35

我同意你的朋友.您正在AnImporter中构建可能可重用的服务,该服务可能会在具有多个主服务器的多个程序中使用.因此,使一个主要特殊并将其嵌入AnImporter并没有多大意义.


dig*_*nie 14

我可能会和你的朋友一起去,因为我宁愿尽可能快地走出课堂.当你想要原子地测试(只是可运行的类)或者你想要模拟出来时,它有助于促进测试.越早离开主方法,您拥有的选项就越多.如果你有一个主要方法和其他内容的类,它可能很快就会变得混乱.(即使用一个简单的例子,例如你描述的那个例子,它可能看起来不那样)

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


cle*_*tus 11

我不会用main方法污染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
  }
}
Run Code Online (Sandbox Code Playgroud)

代替:

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它感觉更干净.


Uri*_*Uri 7

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

1)在某种程度上,主要是让你的程序从命令行启动的黑客攻击.任何包含它的类应该只有一个责任:让程序从命令行开始.通过将它与主运行程序放在一起,就会污染可运行的程序.

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

3)您最终可能会从不同的环境(例如,Eclipse插件或OGSI模块,applet,基于Web的工具等)运行该程序.在这些情况下,您可能希望限制对main的访问.使用该功能可以防止这种情况发生.

4)有时更容易将main保留在默认包中以更快地执行运行时(例如,java myblabla par1 par2 par3),但您绝对不希望其余代码在默认包中.