有人告诉我,我们不应该从同一个类中的另一个公共方法调用类的公共方法.现在我无法理解这一点,因为我没有看到任何问题.一旦方法被声明为公共方法,那么它的合同将在生命周期内被修复,因此从另一个公共方法调用它时应该没有任何问题.
所以我不确定这个陈述是否属实,或者可以从另一个公共API调用公共api [这是从设计的角度来看]?
Gra*_*mas 11
当你尝试时,你的编译器会对你不好意思吗?没有?那么在这方面它是合法的.
提供此"建议"的人是否会生成任何解释标准的规范文档(在行业内或在您的组织内)?没有?然后它的意见.
请咨询您的公司标准,否则,我称之为废话.
Max*_*idt 10
如果从其他公共方法调用公共方法,则会使单元测试更加复杂.如果一个方法依赖于同一个类的另一个方法,则无法模拟它以单独测试它.因此,您可能必须为同一方法编写测试代码两次.
另请参见单元测试调用另一种方法的方法
当您经常从同一个类的其他公共方法调用公共方法时,可能意味着您有不必要的实用程序方法.也许你应该尝试多做一些DRY,以便于维护并保持API易于掌握.
但这只是一个警告,从另一个方法调用公共方法是完全有效的,你会发现许多java.lang标准代码的例子.
一个例子来自java.lang.String:
1462 public boolean startsWith(String prefix) {
1463 return startsWith(prefix, 0);
1464 }
Run Code Online (Sandbox Code Playgroud)
将某些方法设为私有只是为了强制执行关于不调用其他公共方法的公共方法的规则是没有意义的.
小智 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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你调用 Child 对象的 getAverage 方法,你会得到一些意想不到的值,Child 对象的整个接口都被破坏了。您也必须覆盖 getAverage 方法...
字符串类示例
1462 public boolean startsWith(String prefix) {
1463 return startsWith(prefix, 0);
1464 }
Run Code Online (Sandbox Code Playgroud)
从这个角度来看是错误的,因为字符串是最终的,所以你不能继承它并覆盖它的公共方法..