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

时间:2009-04-08 22:33:03

标签: java coding-style

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

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中更好的方法。你对这个话题有什么看法?在哪里,最重要的是,为什么,您将主要方法放在放置它的位置?

6 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:14)

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

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

答案 2 :(得分: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
  }
}

而不是:

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();
    }
  }
}

感觉更干净。

答案 3 :(得分:7)

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

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

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

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

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

答案 4 :(得分:2)

除了OS shell之外,main(字符串列表)的接口几乎没用。

你的主人应该拥有尽可能少的代码。

实际上,您的public class ThisIsMyApp {...}应该只是实际工作的操作系统界面,而在其他地方。

答案 5 :(得分:0)

我会将主方法与代码分开。

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

该项目包含针对400多个不同问题的编程竞赛解决方案。你有更好的组织吗?