【问题标题】:calling method Versus class.method调用方法与 class.method
【发布时间】:2008-12-08 12:55:50
【问题描述】:

我有一个类,其中定义了两个方法。

public class Routines {

     public static method1() {
      /* set of statements */
     }

     public static method2() {
      /* another set of statements.*/
     }
}

现在我需要从 method2() 调用 method1()

以下哪种方法更好?或者这是否可以作为一个问题?

public static method2() {

        method1();

}

public static method2() {

        Routines.method1();

}

【问题讨论】:

    标签: java coding-style


    【解决方案1】:

    虽然我同意现有的答案,即这主要是一个样式问题,但 Eclipse 和 IntelliJ 的代码批评者都会在不使用Classname.method() 风格。

    我养成了强调意图的习惯,通过使用类名来限定对静态目标的引用,this 来限定对实例目标的引用,并使用裸名来限定本地引用。现代 IDE 将为这些结构使用不同的突出显示,所以我认为这些天它不那么重要了。我喜欢维护者(通常是我自己)知道这是什么意思,是的,我知道这是一个 static 参考。

    是的,它确实使代码更加冗长,但我认为值得额外的字符。

    【讨论】:

    • 不是在非静态上下文中使用静态成员时的警告吗?这里 method2() 是一个静态上下文...所以我认为不会有警告...
    • @Vinze:我也看到了这条消息。您很可能是正确的,在这种特定情况下,不会显示该消息。然而,由于问题是关于风格和为什么,我概括了一下(也许没有足够仔细地阅读这个例子;-))
    • 完全同意,我使用“this”。以及 - 清晰就是一切
    • 这(双关语:))是一种风格问题,并且已经在许多问题上进行了详细讨论......
    • 在引用常量时是否也使用类名?即 Classname.MY_PUBLIC_FINAL_VALUE 和 Classname.MY_PRIVATE_FINAL_VALUE 来自 Classname?
    【解决方案2】:

    我会采用第一种方法。在我看来,它相当于:

    public void method2()
    {
        method1();
    }
    

    和:

    public void method2()
    {
        this.method1();
    }
    

    我不知道有多少人在调用类中的另一个方法时会显式调用 this。所以我个人的口味是选项 1 - 无需明确调用 ClassName。

    【讨论】:

    • 如果这两种方法都是静态的,就不要使用 this.method1() 。当它工作时,你会得到一个编译器警告。
    • @R。 Bemrose - 它不起作用,你会得到一个编译器error。您不能使用 this 调用静态方法。
    • 您不能在静态方法中使用“this”——这是一个错误。您可以从非静态方法中使用 this.staticMethod() 。这将默认生成一个警告——一些编译器可以配置为将其视为错误。
    【解决方案3】:

    这纯粹是一个风格问题,所以这取决于你的口味。

    我更喜欢第一个版本。由于这两种方法在同一个类中,我觉得重复类名没有用。

    【讨论】:

      【解决方案4】:

      嗯,它可以作为一个问题,但显然结果将是相同的,所以这只是风格问题。 (可能有一些奇怪的过载情况可能会有所作为,但你应该从一开始就避免这些情况。如果你愿意,我可以提供示例,但这可能不值得。)

      如果您觉得特别需要强调它是一种静态方法,请随意将其设为 Routines.method1() - 但通常我会将其保留为 method1()

      编辑:我试图想出一个例子,使用params 重载会有所不同:

      void CallMethod()
      {
          Console.WriteLine("Calling Method()");
          Method();
          Console.WriteLine("Calling Test.Method()");
          Test.Method();
      }
      
      void Method(params string[] ignored)
      {
          Console.WriteLine ("  Instance method called");
      }
      
      static void Method()
      {
          Console.WriteLine ("  Static method called");
      }
      

      这在这两种情况下都会调用静态方法。 (有趣的是,将 params 放在静态方法上会使用 MS C# 编译器给出一个稍微令人困惑的错误消息,并彻底破坏 Mono 编译器 - 至少是我正在使用的版本。)

      使用参数,您可能会遇到使用泛型类型参数和类型推断的奇怪情况,但如果没有任何参数,情况并非如此。即便如此,非泛型形式将优先。

      总之,我觉得我毕竟做不到:(

      【讨论】:

      • 静态方法不能被覆盖所以我认为这纯粹是一个风格问题
      • 我没有提到覆盖。我提到了重载。
      • 乔恩:我很想看一个例子:)
      • 在 Java 中(不确定 C#),重载静态方法只会在您扩展父类并创建带有匹配签名的新方法时变得棘手。完全限定的方法调用一起避免了这个问题。
      • @basszero:我的尝试中的棘手之处在于这两种方法具有不同的签名,但它们都匹配。但是,从外观上看,这在规范中已经很明确了。
      【解决方案5】:

      我愿意

      public static method2() {
              Routines.method1();
      }
      

      没有猜测。 如果我从父类调用静态方法,这很清楚。 出于同样的原因,我不喜欢静态导入。

      【讨论】:

      • 同意。我什至不认为这是一个风格问题。正确的做法是让你的代码清晰,这表明它是一个静态方法。
      • 我敢打赌,如果 Java/C# 编译器强制我们添加“this”,我们将在所有程序中减少错误。 / “班级。”所有班级成员;其他一切都是本地的。
      【解决方案6】:

      这只是个人喜好和代码可读性的问题,但仅调用“method1()”并不等同于“this.method”,因为示例中的两个方法都是静态的,您不能调用对象,它有没有被实例化。使用静态方法是无法预见的,如果在调用方法的那一刻有实例化对象,则不能使用“this”。 "this" 只是一个指向执行对象的指针,如果实例化的话。

      回答问题:

      只写“method1()”而不是“Routines.method1()”是完整的语法糖。计算机执行/调用的结果,也就是编译器从代码中得到的结果,是完全一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多