24

我正在研究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; 
    } 
} 

是怎样的第一个样本更有益?

回答

28

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

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

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

+1

我不明白你的意思。如果我错过了一些东西,请原谅我。我说:“所以拥有一个私有方法总是很好,因为你知道改变它没有问题,即使你可以安全地向该方法添加更多参数”。但是,面向客户端的公共API仍然是一样的。所以你写了一个公共方法中的所有逻辑,或者在其中调用一个函数,或者做任何查看公共API的客户端都没有观察到任何差异的东西。实现中的代码仍然可以在任何时间点更改,这与改变私有函数的合同/实现一样好 – Saurabh

+0

@saury在这种特殊情况下,是的,它是相同的API,但您仍然不能保证它未来会保持不变。根据我自己的经验,我可以从“哦,让我们直接公开这个想法”这个想法为您提供建议,如果将来我们需要它私人化,我们会改变它“最终发生的事情是这样的方法从来没有成为私有的,所以它最好是在开始时有一点过度体系结构,而不是稍后再做一个巨大的重构。 –

+0

如果一个公共方法调用了“没有问题”更改的私有方法,那么公共方法是否会中断呢?如果是这样,在“安全地改变”任何事物方面没有任何区别。无论你改变什么都必须进行测试 - 使其公开/私人不会给你任何额外的安全性。 – gented

2

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

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

+1

是的,我同意你的意见。我试图问的问题是,与公共方法相比,为什么在私有方法中编写实现代码有益?如果我们将所有的代码放入公共方法中,这会产生什么不同?基本上,我们仍然以同样的方式调用公共方法,我们仍然期待它能像以前一样返回相同的结果。 – kpatelio

+3

@ user600194保持代码私有隐藏了实现细节,并允许在不中断API使用者的情况下更改实现。隐藏/封装的级别通常是任意的(偶尔反复无常)。 –

0

制定职能私人给你在下列情况下的优势:

  1. 制作功能私营给JVM编译器内联函数,从而提高了应用性能
  2. 的选项如果类是继承和你扩展它来自一个子类,那么如果你想隐藏子类的函数,那么你可以这样做(你可以扩展StringTokenizer)。
  3. 如果一段代码在多种功能中使用的您移动代码在私营公用事业方法
+0

你的#3不是私人的优势*;共享代码可以是公共的或私有的。 –

+0

好的,为了解释我的观点,进一步说你有一套算法实现功能(全部公开)。现在万一您的不同API需要计算两个数字平方和的平方根,那么最好将这个逻辑移入一个以两个数字作为输入的私有函数中。公开这样的功能可能没有多大意义,因为你的班级正在为不同的算法问题联盟提供解决方案。制作这样一个公共的功能可能会破坏该类的定义。 – Saurabh

1

当用Java编写干净的代码或其它任何面向对象的语言,一般干净最可读的代码由简短的简短方法组成。经常会发现,方法中的逻辑可以在单独的方法调用中更好地表达,以使代码更清洁,更易于维护。

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

使用私有方法,我们可以隐藏不在和不应该从类之外的任何地方访问的逻辑。

1

公共方法通常是其他实现该类的类将要使用的代码。在班级以外,私人方法通常没有那么有用,或者不(仅仅)服务于课堂要完成的目的。

假设你在你选择的IDE中,并且你实现了一个A类.A类只被设计用来做一件事,比如文档生成。自然,您将在A类中有一些数学和字节操作方法来生成文档,但试图使用A类的人不会需要这些其他方法,因为他们只是想要一个文档。所以我们使这些方法保持私密,以便为我们班的将来用户保持简单。

0

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

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

1

声明的方法私人的目的是

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

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