有人告诉我,我们不应该从同一个类中的另一个公共方法调用一个类的公共方法。现在我无法理解这一点,因为我没有看到任何问题。一旦一个方法被宣布为公共的,那么它的契约就会在生命周期内被固定,因此从另一个公共方法调用它应该没有任何问题。
所以我不确定这种说法是否属实,或者可以从另一个公共 api 调用公共 api [这是从设计角度来看的]?
有人告诉我,我们不应该从同一个类中的另一个公共方法调用一个类的公共方法。现在我无法理解这一点,因为我没有看到任何问题。一旦一个方法被宣布为公共的,那么它的契约就会在生命周期内被固定,因此从另一个公共方法调用它应该没有任何问题。
所以我不确定这种说法是否属实,或者可以从另一个公共 api 调用公共 api [这是从设计角度来看的]?
当您尝试时,您的编译器是否会阻止您?不?那么在这方面它是合法的。
提供此“建议”的人是否提供任何解释标准的规范文件(在行业内或在您的组织内)?不?然后是意见。
咨询贵公司的标准,否则,我称之为废话。
如果您从其他公共方法调用公共方法,它会使单元测试更加复杂。如果一种方法依赖于同一类的另一种方法,则不能模拟它来单独测试它。因此,您可能必须为同一方法编写两次测试代码。
当您经常从同一类的其他公共方法调用公共方法时,这可能意味着您有不必要的实用程序方法。也许您应该尝试更加 DRY 以简化维护并使您的 API 易于掌握。
但这只是一个警告,从另一个方法调用公共方法是完全有效的,您会发现许多java.lang
标准代码的例子就是这样做的。
一个例子java.lang.String
:
1462 public boolean startsWith(String prefix) {
1463 return startsWith(prefix, 0);
1464 }
将某些方法设为私有只是为了强制执行关于不调用其他公共方法的公共方法的规则是没有意义的。
在我看来,由于继承,您应该避免在另一个方法中调用公共方法。考虑类:
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 }
从这个角度来看是错误的,因为字符串是最终的,所以你不能继承它并覆盖它的公共方法..
我只是在这里总结答案并添加一些上下文:
我的 2 美分:
我不确定他的意思。您显然可以从另一个公共方法调用公共方法。这不是一个坏主意——即使是 Java 的源代码也有一个公共方法调用另一个公共方法的方法。
你为什么不问问建议你的人解释原因?我认为他比我们更能说明问题。
当然,您可以从另一个公共方法调用任何公共方法,无论它是在同一个类中还是在另一个类中。但是标准对于不同的组织来说确实很重要。给他/她一些有效的例子。