12

有人告诉我,我们不应该从同一个类中的另一个公共方法调用一个类的公共方法。现在我无法理解这一点,因为我没有看到任何问题。一旦一个方法被宣布为公共的,那么它的契约就会在生命周期内被固定,因此从另一个公共方法调用它应该没有任何问题。

所以我不确定这种说法是否属实,或者可以从另一个公共 api 调用公共 api [这是从设计角度来看的]?

4

7 回答 7

11

当您尝试时,您的编译器是否会阻止您?不?那么在这方面它是合法的。

提供此“建议”的人是否提供任何解释标准的规范文件(在行业内或在您的组织内)?不?然后是意见。

咨询贵公司的标准,否则,我称之为废话。

于 2013-02-07T10:21:49.063 回答
11

如果您从其他公共方法调用公共方法,它会使单元测试更加复杂。如果一种方法依赖于同一类的另一种方法,则不能模拟它来单独测试它。因此,您可能必须为同一方法编写两次测试代码。

另请参阅对调用另一个方法的方法进行单元测试

于 2013-06-03T13:03:43.760 回答
7

当您经常从同一类的其他公共方法调用公共方法时,这可能意味着您有不必要的实用程序方法。也许您应该尝试更加 DRY 以简化维护并使您的 API 易于掌握。

但这只是一个警告,从另一个方法调用公共方法是完全有效的,您会发现许多java.lang标准代码的例子就是这样做的。

一个例子java.lang.String

1462    public boolean startsWith(String prefix) {
1463        return startsWith(prefix, 0);
1464    }

将某些方法设为私有只是为了强制执行关于不调用其他公共方法的公共方法的规则是没有意义的。

于 2013-02-07T10:23:11.157 回答
5

在我看来,由于继承,您应该避免在另一个方法中调用公共方法。考虑类:

public class Parent {

    //return sum
    public double getSum(double... value){
        //implementation
    }

    //return average
    public double getAverage(int count){
        //call getSum
        double sum = getSum(20, 40, 60);
        return sum / count;

    }
}

public class Child extends Parent {

    @Override
    public int getSum(double... obj){
        // change implementation
        // always return 100;
    }
}

如果你调用 Child 对象的 getAverage 方法,你会得到一些意想不到的值,Child 对象的整个接口都被破坏了。您也必须覆盖 getAverage 方法...

字符串类示例

1462    public boolean startsWith(String prefix) {
1463        return startsWith(prefix, 0);
1464    }

从这个角度来看是错误的,因为字符串是最终的,所以你不能继承它并覆盖它的公共方法..

于 2015-12-09T10:03:54.870 回答
2

我只是在这里总结答案并添加一些上下文:

  • 在同一个类中重用来自公共方法的公共方法是合法的编译方式。
  • 它被认为是 API 设计的一种不好的做法,因为它使您的类设计容易继承错误,因为它可能会覆盖一个方法而不覆盖另一个方法,从而破坏了您的类的逻辑(这一点来自一个著名的 Java“最佳实践”书“有效的Java”,在那里得到了很好的解释,并且在这个问题的另一个答案中也得到了很好的解释)
  • 在另一个答案中也提到了,您不能模拟公共方法,因此可能需要关注单元测试

我的 2 美分:

  • 使类“最终”不再是一个坏习惯,因为您不会为继承设计 API。
  • 我不认为单元测试有问题,如果您的方法之一是私有的,您可以像编写测试一样编写测试。
于 2020-12-03T16:30:19.860 回答
1

我不确定他的意思。您显然可以从另一个公共方法调用公共方法。这不是一个坏主意——即使是 Java 的源代码也有一个公共方法调用另一个公共方法的方法。

你为什么不问问建议你的人解释原因?我认为他比我们更能说明问题。

于 2013-02-07T10:22:16.173 回答
0

当然,您可以从另一个公共方法调用任何公共方法,无论它是在同一个类中还是在另一个类中。但是标准对于不同的组织来说确实很重要。给他/她一些有效的例子。

于 2013-02-07T10:46:11.970 回答