![](/img/trans.png)
[英]Does it make sense to declare variables as private with getters/setters for class member definitions declared within a public class?
[英]Use public getters/setters to access private variables in the same class, or access the variables directly
我正在学习编程,虽然我觉得我对编程有很好的了解(多年来一直在编写PHP,Javascript等),但我从未潜入过OOP世界。 因此,我要求对我所处的情况作出一般性回答。我知道总会有一些例外情况,但我在这种情况下寻找最正确的方法。
好的,所以我有两个课程, Game
和GameGraphics
。 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.