关于Java:公共方法和私有方法

Private Methods Over Public Methods

我正在检查StringTokenizer.java班,有几个问题浮现在我的脑海中。

我注意到其他类使用的公共方法调用了一些私有方法,这些方法完成了所有的工作。现在,我知道了ood的一个原则是尽可能多地进行私有化,并隐藏所有实现细节。但我不确定我是否完全理解这背后的逻辑。

我理解,将字段设为私有字段非常重要,以防止在其中存储无效值(这只是许多原因之一)。然而,当涉及到私有方法时,我不知道它们为什么如此重要。

例如,在StringTokenizer类的情况下,我们不能将所有实现代码都放在公共方法中吗?因为这些方法的API(即调用这些公共方法的规则)将保持不变,所以它对使用这些方法的类有何不同?我能想到为什么私有方法有用的唯一原因是它可以帮助您编写重复的代码。例如,如果所有公共方法都做了相同的事情,那么您可以声明一个私有方法,该方法执行此任务,并且可以由公共方法使用。

另一个问题是,用私有方法而不是公共方法编写实现的好处是什么?

下面是一个小例子:

1
2
3
4
5
6
7
8
9
10
public class Sum{

    private int sum(int a, int b){
        return a+b;
    }

    public int getSum(int a, int b){
        return sum(a,b);
    }
}

对…

1
2
3
4
5
6
public class Sum{

    public int getSum(int a, int b){
        return a+b;
    }
}

第一个样本如何更有益?


为了添加一些内容,可以安全地更改私有方法,因为您可以确信,只有从自己的类调用私有方法,没有外部类能够调用私有方法(它们甚至看不到)。

因此,拥有一个私有方法总是很好的,因为您知道更改它没有问题,即使您可以安全地向该方法添加更多参数。

现在考虑一个公共方法,任何人都可以调用该方法,因此如果添加/删除一个参数,您还需要更改对该方法的所有调用。


The only reason I could think of why private methods are useful is because it helps you from writing duplicate code.

除了合并重复的代码(通常表示为"不要重复自己"或"dry"),使用私有方法还可以帮助您构造和记录代码。如果你发现自己写的方法可以做很多事情,你可能会考虑把它分成几个私人的方法。这样做可能会使每个逻辑块的输入和输出更加清晰(粒度更细)。此外,描述性方法名称可以帮助补充代码文档。


声明方法private的目的是

  • 隐藏实现详细信息
  • 不将该方法列为公共API
  • 确保代码背后的逻辑不会在外部使用/误用
  • 大多数时候,方法的执行依赖于它之前运行的其他方法;然后,您还可以确保控制使用方法的正确顺序。

对方法使用private,除非您希望在类上下文之外安全地使用方法。


公共方法通常是实现该类的其他类想要使用的代码。私有方法在类外部通常没有那么有用,或者(单独)不服务于类要实现的目标。

假设您在您的IDE中选择,并且您实现了一个类A。类A只设计用于做一件事情,比如说文档生成。当然,您将在类A中有一些数学和字节操作方法,这些方法是进行文档生成所必需的,但是试图使用类A的人不需要这些其他方法,因为他们只需要一个文档。因此,我们将这些方法设置为私有的,以便为我们类的任何未来用户保持简单的操作。


当用Java或任何其他面向对象语言编写干净代码时,通常最干净的最可读代码由简短简洁的方法组成。通常情况下,一个方法中的逻辑可以更好地用单独的方法调用来表示,以使代码更干净、更易于维护。

考虑到这一点,我们可以设想这样的情况:您有许多方法来执行任务以实现一个目标。想想一个只有一个复杂目的的类。该单一目标的入口点可能只需要一个起点(一个公共方法),但需要许多其他方法,这些方法是复杂操作的一部分(许多私有帮助方法)。

使用私有方法,我们能够隐藏逻辑,而逻辑不是也不应该从类本身之外的任何地方访问。


在公共类中使用私有方法的一个优点也是一个很好的理由是为了安全和防止bug。声明为私有的方法只能由它们所属的类访问。这意味着您的私有方法不能意外地从程序内的其他地方调用,从而减少错误和其他并发症。如果您声明您的方法是公开的,那么整个问题都可以访问它,并可能导致复杂的情况。

您可能有许多方法处理某个数据块,而您不希望程序的任何其他部分能够干扰这些数据块。通过私有方法和/或变量使用数据封装有助于防止这种情况的发生,并使代码更易于跟踪和记录。


在以下情况下,将函数设为私有会给您带来优势:

  • 使函数私有化使JVM编译器可以选择嵌入函数,从而提高应用程序性能
  • 如果类是可继承的,并且您从子类扩展它,那么如果您想从子类隐藏函数,那么您可以这样做(您可以扩展StringTokenizer)。
  • 如果一段代码必须在多个函数中使用,则可以在专用实用程序方法中移动该代码。