5

我正在学习编程,虽然我觉得我在编程方面有很好的知识(多年来一直在编写 PHP、Javascript 等),但我从未涉足 OOP 的世界。正因为如此,我要求对我所处的情况给出一个一般性的答案。我知道总会有一些例外,但我正在寻找这种情况下最正确的方法。

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

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

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

4

5 回答 5

2

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

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

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

  • 如果您同时使用 setter 方法和直接字段访问来更新值,您将不得不搜索您的项目两次。首先,通过setter方法。其次,在球场上。请注意,从第二个列出的所有结果都可能是混淆的(该属性可能存在于搜索结果中,因为它要么正在被访问,要么正在被更新)。

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

于 2014-01-09T10:59:27.557 回答
1

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

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

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

这些优点都不适用于私有方法:它们不能实现接口方法,也不能被覆盖。事实上,Java 编译器通常会完全优化它们,尤其是那些更简单的。

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

于 2013-02-10T19:07:46.450 回答
0

这更多的是个人喜好问题。

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

但是,如果你的 getter\setter 做的不仅仅是改变像 logging\etc 这样的值,那么你显然总是需要使用它们。

于 2013-02-10T19:06:05.293 回答
0

如果您只是在学习 OOP,那么一定要坚持通过公共方法公开的私有成员。这并不是说公共领域都不好,而是要了解何时使用哪个,您必须详细研究这两种方法。

在类中,几乎总是直接访问私有成员,这肯定是首选——封装的全部意义在于隔离栅栏内的代码和栅栏外的代码。

于 2013-02-10T19:20:54.603 回答
0

使用任何一个都没问题。getter/setter 的重点是为不了解类内部但类本身知道其内部的客户提供对字段的安全访问。如果 getter/setter 做了一些额外的事情,即使它们是从类内部调用的,也需要调用它们。否则,您可以直接访问字段。

于 2013-02-10T19:08:05.493 回答