我正在检查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);
}
}
Vs…
public class Sum{
public int getSum(int a, int b){
return a+b;
}
}
为什么第一个样本更有益?
为了添加一些东西,私有方法总是可以安全地更改的,因为你可以肯定地知道它只能从自己的类调用,没有外部类能够调用私有方法(他们甚至不能看到它)。
所以有一个私有方法总是好的,因为你知道改变它是没有问题的,甚至你可以安全地给方法添加更多的参数。
现在考虑一个公共方法,任何人都可以调用该方法,所以如果你添加/删除一个参数,你将需要改变对该方法的所有调用。
我能想到的私有方法有用的唯一原因是它可以帮助你编写重复的代码。
除了整合重复的代码(通常表示为"Don't Repeat Yourself"或"DRY")之外,使用私有方法还可以帮助您构建和记录代码。如果你发现自己编写的方法要做好几件事,你可能希望把它分成几个私有方法。这样做可以使每个逻辑块的输入和输出更清晰(以更细的粒度)。此外,描述性方法名可以帮助补充代码文档。
在用Java或任何其他面向对象语言编写干净的代码时,通常最干净最易读的代码由简短的方法组成。经常出现的情况是,方法中的逻辑可以用单独的方法调用来更好地表达,以使代码更清晰,更易于维护。
考虑到这一点,我们可以设想有许多方法执行一个单一目标的任务的情况。设想一个只有一个复杂目的的类。单个目标的入口点可能只需要一个起始点(一个公共方法),但需要许多其他方法,这些方法是复杂操作的一部分(许多私有帮助方法)。
使用私有方法,我们能够隐藏不能也不应该从类本身之外的任何地方访问的逻辑。
公共方法通常是实现该类的其他类想要使用的代码。私有方法在类之外通常不太有用,或者不能(单独地)达到类要完成的目的。
假设你在你选择的IDE中,并且你实现了某个类a。类a只被设计用来做一件事,比如文档生成。当然,在类A中会有一些数学和字节操作方法,它们是生成文档所必需的,但试图使用类A的人不需要这些其他方法,因为他们只想要一个文档。因此,我们将这些方法设为私有,以便为我们类的任何未来用户保持简单。
声明private方法的目的是
- 隐藏实现细节
- 将该方法从公共API列表中排除
- 确保代码背后的逻辑不被外部使用/滥用 大多数时候,你的方法的执行取决于在它之前运行的其他方法;那么您还可以确保您控制了使用方法的正确顺序
对你的方法使用private,除非你想让你的方法在你的类的上下文中被安全地使用。
将函数设为私有在以下情况下具有优势:
- 使函数私有给JVM编译器内联函数的选项,从而提高应用程序的性能
- 如果类是可继承的,你从子类扩展它,然后如果你想从子类隐藏函数,那么你可以这样做(你可以扩展StringTokenizer)。
- 如果一段代码必须在多个函数中使用,则将该代码移动到私有实用程序方法
在公共类中使用私有方法的一个优点和一个很好的理由是为了安全性和防止错误。声明为私有的方法只能由它们所属的类访问。这意味着您的私有方法不会在程序内的其他地方被意外调用,从而减少bug和其他复杂性。如果你将你的方法声明为public,那么整个问题都可以访问它,并可能导致并发症。
你可能有很多方法来处理某一段数据,而你不希望程序的其他部分能够干扰这些数据。通过私有方法和/或变量使用数据封装有助于防止这种情况,也使您的代码更易于跟踪和记录。