【问题标题】:Java Main Method, Good Coding Style [closed]Java Main 方法,良好的编码风格
【发布时间】:2010-10-18 10:39:38
【问题描述】:

我与我的一位朋友就 Java 中 main 方法的正确和良好使用进行了很长时间的讨论。基本上我们有一个这样的类:

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

但是 main 方法应该放在哪里呢?我认为“将代码保留在它所属的位置”是一种很好的做法,从而将上面的代码变成

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

【问题讨论】:

  • 你需要问自己:为什么(或为什么不)main 方法属于那个类?

标签: java coding-style


【解决方案1】:

我不会用 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();
    }
  }
}

感觉更干净了。

【讨论】:

    【解决方案2】:

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

    虽然我也有不同类型的项目。它不包括解决方案的真正工作程序。在这里,我需要使用(和开发)同一个库针对不同的问题运行不同的解决方案。不同的问题不是并行的。我需要从我的 IDE 单独运行一个问题。我发现通过 PSVM 方法使用具有大量类的同一个项目很方便。

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

    【讨论】:

      【解决方案3】:

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

      您的 main 中的代码应该尽可能少。

      确实,您的public class ThisIsMyApp {...} 应该是真正工作的操作系统接口,它在别处。

      【讨论】:

        【解决方案4】:

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

        1) 在某种程度上,main 是一种让您的程序从命令行启动的技巧。任何包含它的类都应该有一个单一的职责:让程序从命令行启动。通过将它与您的主要可运行文件放在一起,您正在污染可运行文件。

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

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

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

        【讨论】:

        • +1 是一个很好的答案,但我会说永远不应该将任何类放在“默认”包中,即使是带有 main 的包也不应该。
        • 我发现不习惯 Java 或使用命令行工具的用户通常更喜欢 C 风格的调用。他们愿意“吸收 JAR”,但这是他们不喜欢的长包序列。
        【解决方案5】:

        我可能会和你的朋友一起去,因为我希望尽快离开使用 main 方法的课程。当您想以原子方式进行测试(只是可运行类)或想模拟事物时,它有助于促进测试。越早退出主要方法,您拥有的选择就越多。如果你有一个包含 main 方法和其他东西的类,它可能会很快变得混乱。 (即使对于一个简单的例子,比如你描述的例子,看起来可能不是这样)

        但我想说可读性和可测试性是尽快退出主要方法(及其包含的类)的两个很好的理由。但是,嘿..这只是我;)

        【讨论】:

        • 是的。我也会尽快退出 Applet/JApplet。
        【解决方案6】:

        我同意你朋友的看法。您正在 AnImporter 中构建一个潜在的可重用服务,该服务可能用于具有多个 main 的多个程序中。因此,将一个 main 特殊并嵌入到 AnImporter 中没有多大意义。

        【讨论】:

          猜你喜欢
          • 2016-04-25
          • 2010-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-17
          • 1970-01-01
          • 2011-02-11
          • 1970-01-01
          相关资源
          最近更新 更多