为什么我们不应该从另一个公众中调用公共方法?

时间:2013-02-07 10:18:09

标签: java

有人告诉我,我们不应该从同一个类中的另一个公共方法调用类的公共方法。  现在我无法理解这一点,因为我没有看到任何问题。 一旦方法被声明为公共方法,那么它的合同将在生命周期内被修复,因此从另一个公共方法调用它时应该没有任何问题。

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

7 个答案:

答案 0 :(得分:12)

当你尝试时,你的编译器是否会对你嗤之以鼻?没有?那么在这方面它是合法的。

提供此“建议”的人是否会生成任何解释标准的规范文档(在行业内或您的组织内)?没有?那就是它的意见。

咨询您的公司标准,否则,我称之为无意义。

答案 1 :(得分:6)

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

另见Unit testing a method that calls another method

答案 2 :(得分:5)

当您经常从同一个类的其他公共方法调用公共方法时,可能意味着您有不必要的实用程序方法。也许你应该尝试多做一些干燥,以便于维护并保持API易于掌握。

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

来自java.lang.String的示例:

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

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

答案 3 :(得分:2)

我不确定他的意思。您显然可以从另一个公共方法调用公共方法。这不是一个坏主意 - 甚至Java的源代码也有一种方法,其中一个公共方法调用另一个公共方法。

为什么不问建议你的人解释原因?我认为他的处境比我们好。

答案 4 :(得分:2)

在我看来,你应该避免因为继承而在另一个方法中调用公共方法。考虑课程:

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方法......

String类

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

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

答案 5 :(得分:2)

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

  • 在同一类中重用公共方法是合法的编译方法。
  • 这被认为是API设计的一种不好的做法,因为给您的类设计继承时容易出错,因为一个方法可以覆盖一个方法而不覆盖另一个方法,这会破坏类的逻辑(这一点来自一个著名的Java“最佳” -实践”这本书“ Effective Java”,在该书中有很好的解释,在该问题的另一个答案中也有很好的解释)
  • 在另一个答案中也提到过,您不能模拟公共方法,因此可能需要进行单元测试

我的2美分:

  • 将类设为“ final”使其不再是一种不好的做法,因为您没有设计用于继承的API。
  • 我认为单元测试无关紧要,您可以像编写其中一种方法为私有方法一样编写测试。

答案 6 :(得分:0)

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