繁体   English   中英

使用公共getter / setter访问同一个类中的私有变量,或直接访问变量

[英]Use public getters/setters to access private variables in the same class, or access the variables directly

我正在学习编程,虽然我觉得我对编程有很好的了解(多年来一直在编写PHP,Javascript等),但我从未潜入过OOP世界。 因此,我要求对我所处的情况作出一般​​性回答。我知道​​总会有一些例外情况,但我在这种情况下寻找最正确的方法。

好的,所以我有两个课程, GameGameGraphics GameGraphics将创建一个Game对象并使用它拥有的所有方法。 我们最近了解到一个类的所有变量都应该是私有的,因此GameGraphics通过getter和setter访问Game中的所有变量。

但是,当我想在Game类中访问Game的变量时,我应该使用公共方法,还是直接访问变量? 对此最正确的方法是什么?

如果重要的话,我正在用Java开发。 请原谅我缺乏OOP经验。

使用访问器方法(getter和setter)访问其他类的变量的两个主要原因是

  • 将访问者呈现为界面成员的能力,以及
  • 覆盖子类中的访问器的能力。

可读性的轻微下降是为这些优势付出的合理代价,因为它们可以让您封装类的逻辑,从而更加严格地控制您。

当涉及到私有方法时,这些优点都不适用:它们无法实现接口方法,也无法覆盖它们。 实际上,Java编译器通常会完全优化它们,尤其是更简单的算法。

这就是为什么我建议直接使用实例变量,而不是添加一个无助于可读性的额外层,而是由编译器进行优化。

我建议你总是使用访问器方法。 稍后您的程序将更容易调试。

让我给出一个相当常见的场景。 假设您注意到属性是如何意外更新的,并且您想知道代码中可能更新属性的位置:

  • 如果您一直使用setter来更新值。 您可以只搜索该字段的setter方法,一旦整个项目就大功告成了。 代码中可能没有其他地方可以更新值。 甚至不在类本身内部(请记住:除了访问者之外没有直接的字段访问)。

  • 如果通过同时使用setter方法和直接字段访问来更新值 ,则必须两次搜索项目。 首先,通过setter方法。 第二,由现场。 请注意,从第二个列出的所有结果可能会混淆(该属性可能在搜索结果中存在,因为它正在被访问或正在更新 )。

此外,如果要在更新或访问属性时进行一些调试并检查某些值,则可以将断点放在其setter或getter方法中。 简单。 您不需要将断点放在其他一些地方。

这更多的是个人偏好而不是其他任何事情。

你使用getter \\ setter的原因主要是隐藏调用类的实现(在你的例子中是GameGraphics)。 当其他开发人员需要使用您的代码时,这是很好的。 并且您的getter \\ setter直接访问成员,因此在调用实例变量时调用它们有点多余。

但是,如果你的getter \\ setter做了别的事情,而不仅仅是改变了像logging等等的值那么你显然总是需要使用它们。

也可以使用它们。 getter / setter的目的是为不了解类内部的客户提供对字段的安全访问,但类本身确实知道它的内部。 如果getters / setter做了一些额外的事情,即使他们是从课堂内部调用的,也需要做一些其他事情。 否则,您可以直接访问字段。

如果你只是学习OOP,那么一定要坚持通过公共方法暴露的私人成员。 这并不是说公共领域都很糟糕,但要了解何时使用,你必须详细研究这两种方法。

在类中,私有成员几乎总是直接访问,这肯定是第一选择 - 封装的整个点是围栅内的代码和代码之外的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM