【问题标题】:Create instance of main vs static methods创建主要与静态方法的实例
【发布时间】:2020-05-19 22:54:54
【问题描述】:

我想知道这样做有什么好处

public static main(String[] args)
{
    Main mainInstance = new Main();
    mainInstance.Foo();
}

public void Foo() {}

在此

public static main(String[] args)
{
    Foo();
}

public static void Foo() {}

我习惯的是第二个例子,但我遇到了一段和第一个例子一样的代码,我很想知道它是否比另一个有什么好处

【问题讨论】:

  • 想知道它是否比其他的有什么好处——你自己能想到什么?
  • 嗯,这取决于Foo 实际做了什么,但如果它使用存储在类实例中的任何数据,那么它需要是一个实例方法。

标签: java class static main


【解决方案1】:

静态方法/变量存储在静态内存中。即使这些方法/变量没有使用一次,它们也始终存在于内存中。因此,如果有一些代码正在使用大内存,则不建议将它们声明为静态。 另一方面,如果某些方法在整个执行过程中很少被调用,并且不依赖于对象的状态,则可以将其声明为静态。这将为声明对象、其类变量等节省内存。

【讨论】:

    【解决方案2】:

    在一个简单的示例中(例如您的示例),没有区别。

    更一般地说,我认为第一种方法比第二种方法有两个优点:

    1. 假设foo 方法和其他方法利用了包含在封闭类的字段中的信息。如果方法是static,那么字段也需要是static。静态变量使单元测试变得困难,这是一个公认的事实。第一种方法避免了这个问题,无论是用于测试main 还是其他方法。

    2. 假设封闭类 (Main) 提供的功能很重要,并且您希望能够重用它。如果您像这样构建代码:

      public class Main {
      
          public static main(String[] args) {
              Main main = new Main();
              // parse 'args' and set config parameters in 'Main' fields 
              main.doIt();
          }
      
          public void doIt() {
              ...
          }
      }
      

      那么您可以通过其他方式使用main 的功能。例如,您可以这样使用它:

      Main.main(new String[]{"arg1", "arg2"});
      

      或者像这样:

      Main m = new Main();
      m.setConfigParam1(...);
      m.setConfigParam2(...);
      m.doIt();
      

      使用实例和实例字段为您提供了更大的灵活性。

    这些是否重要取决于上下文。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      相关资源
      最近更新 更多