29

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

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

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

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

另一个问题,与公共方法相比,在私有方法中编写实现有什么好处?

这是一个小例子:

public class Sum{

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

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

比...

public class Sum{

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

第一个样本如何更有益?

4

7 回答 7

34

为了添加一些东西,总是可以安全地更改私有方法,因为您肯定知道它只能从自己的类中调用,没有外部类能够调用私有方法(他们甚至看不到它)。

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

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

于 2011-10-13T03:53:02.330 回答
2

我能想到为什么私有方法有用的唯一原因是因为它可以帮助您编写重复的代码。

除了合并重复代码(通常表示为“不要重复自己”或“DRY”)之外,使用私有方法还可以帮助您构建和记录代码。如果您发现自己编写的方法可以做几件事,您可能希望考虑将其拆分为几个私有方法。这样做可以更清楚地了解每个逻辑的输入和输出是什么(以更精细的粒度)。此外,描述性方法名称可以帮助补充代码文档。

于 2011-10-13T03:20:46.783 回答
1

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

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

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

于 2011-10-13T03:42:44.347 回答
1

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

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

于 2011-10-13T03:51:39.977 回答
1

将方法声明为私有的目的是

  • 隐藏实现细节
  • 排除方法被列为公共 API
  • 确保代码背后的逻辑没有被外部使用/误用
  • 大多数情况下,您的方法的执行取决于在它之前运行的其他方法;那么您还可以确保控制使用方法的正确顺序

对您的方法使用私有,除非您打算在您的类的上下文之外安全地使用您的方法。

于 2016-06-10T02:03:39.607 回答
0

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

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

于 2013-02-05T12:27:44.263 回答
0

将函数设为私有可以在以下情况下为您提供优势:

  1. 将函数设为私有为 JVM 编译器提供了内联函数的选项,从而提高了应用程序的性能
  2. 如果该类是可继承的并且您从子类扩展它,那么如果您想从子类中隐藏函数,那么您可以这样做(您可以扩展 StringTokenizer)。
  3. 如果必须在多个函数中使用一段代码,您可以在私有实用程序方法中移动该代码
于 2011-10-13T03:37:18.110 回答