调用方法与class.method

时间:2008-12-08 12:55:51

标签: java coding-style

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

public class Routines {

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

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

现在我需要从method2()

调用method1()

以下哪种方法更好?或者这是否有资格作为问题?

public static method2() {

        method1();

}

OR

public static method2() {

        Routines.method1();

}

6 个答案:

答案 0 :(得分:12)

虽然我同意现有的答案,这主要是一个样式问题,但是Eclipse和IntelliJ的代码评论家都会在不使用该代码的代码中标记“对静态方法的非静态引用”这样的样式问题已经足够了。 Classname.method()风格。

我习惯强调 intent ,方法是使用classname来限定对静态目标的引用,this来限定对实例目标的引用,以及本地引用的裸名称。现代IDE将对这些构造使用不同的突出显示,所以我认为它现在不那么重要了。我喜欢维护者(通常是我自己)知道意图是什么,是的,我知道这是static引用。

是的,它确实会产生稍微冗长的代码,但我认为值得额外的角色。

答案 1 :(得分:6)

我会选择第一种方法。在我看来,这相当于:

public void method2()
{
    method1();
}

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

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

答案 2 :(得分:1)

嗯,它有资格作为一个问题,但显然结果将是相同的两种方式,所以这只是一种风格问题。 (可能有很奇怪的过载情况,可以发挥作用,但你应该避免那些开始。如果你愿意,我可以提出例子,但它可能不值得。)

如果您觉得特别需要强调它是一种静态方法,请随意将其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编译器 - 至少我正在使用的版本。)

使用参数,您可以使用泛型类型参数和类型推断进入奇怪的情况,但不能没有任何参数。即便如此,非通用形式也会优先。

简而言之,毕竟我认为我无法做到:(

答案 3 :(得分:1)

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

我更喜欢第一个版本。因为这两个方法属于同一个类,所以我觉得重复类名没有用。

答案 4 :(得分:0)

我做

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

没有猜测。 我是否从父类调用静态方法非常清楚。 出于同样的原因,我不喜欢静态导入。

答案 5 :(得分:0)

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

回答这个问题:

只需编写“method1()”而不是“Routines.method1()”就是完整的语法糖。计算机执行/调用的结果(编译器从代码中生成的结果)完全相同。