【问题标题】:Why we should not call public method from another public?为什么我们不应该从另一个公共调用公共方法?
【发布时间】:2020-12-04 00:30:19
【问题描述】:

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

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

【问题讨论】:

  • 我不知道为什么你的问题被否决了,但是那个人告诉你的没有意义
  • 所以我不确定那句话是真是假自己做一个小测试,我想如果你自己会得到答案。

标签: java


【解决方案1】:

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

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

请查阅贵公司的标准,否则,我称之为废话。

【讨论】:

  • -1:有避免从内部调用公共方法的动机,无论人们是否同意它们的优点。此答案无助于理解建议的动机。
【解决方案2】:

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

另见Unit testing a method that calls another method

【讨论】:

    【解决方案3】:

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

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

    来自java.lang.String 的示例:

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

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

    【讨论】:

      【解决方案4】:

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

      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    }
      

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

      【讨论】:

      • 我想这就是书籍推荐它的原因。当人们重写公共方法时,他们不希望引入副作用。
      【解决方案5】:

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

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

      我的 2 美分:

      • 将类设为“final”不再是一种糟糕的做法,因为您无需为继承设计 API。
      • 我认为单元测试没有问题,如果您的方法之一是私有的,您可以像编写测试一样编写测试。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2022-01-06
            • 1970-01-01
            • 2010-09-24
            • 1970-01-01
            • 2023-03-23
            • 1970-01-01
            • 2021-10-23
            • 2011-12-11
            • 2011-03-23
            相关资源
            最近更新 更多