Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象:setter应该是私有的吗?_Oop_Class_Setter - Fatal编程技术网

Oop 面向对象:setter应该是私有的吗?

Oop 面向对象:setter应该是私有的吗?,oop,class,setter,Oop,Class,Setter,在类中编写getter/setter时,setter应该是private方法吗 必须编写另一个方法来设置变量似乎有点多余,但这似乎允许更易于维护的代码结构。Setter是一种允许修改对象内部状态而不直接公开该对象的方法。稍后,我们可以在setter中包含验证或其他逻辑 如果你的二传手是私人的,你就没有抓住要点。这就像你家里有一扇门总是关着,甚至不允许打开。在类内部,您也可以直接访问字段,为什么要使用setter呢 当然,真正的问题是:我们应该有二传手吗?现在的典型类包含一堆字段、自动生成的get

在类中编写getter/setter时,setter应该是private方法吗


必须编写另一个方法来设置变量似乎有点多余,但这似乎允许更易于维护的代码结构。

Setter是一种允许修改对象内部状态而不直接公开该对象的方法。稍后,我们可以在setter中包含验证或其他逻辑

如果你的二传手是私人的,你就没有抓住要点。这就像你家里有一扇门总是关着,甚至不允许打开。在类内部,您也可以直接访问字段,为什么要使用setter呢


当然,真正的问题是:我们应该有二传手吗?现在的典型类包含一堆字段、自动生成的getter/setter,而没有逻辑。这几乎不是一门课。它只是一个结构,访问元素的方式很笨拙。但这不是你想要的。如果目的是允许从外部对象操纵它们,它们应该是公共的。这就是POJO实现的要点。(http://en.wikipedia.org/wiki/Plain_Old_Java_Object)


如果您希望实现其他模式,那么查看Java访问修饰符上的文档应该是您的第一站(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)

通常您希望setter/getter是公共的,因为这就是它们的用途:访问数据,您不想让其他人直接访问,因为您不想让他们弄乱依赖于实现的细节——这就是封装的意义所在


但是,在某些情况下,您可能只想将对数据的访问限制在同一类的实例上,但仍然希望出于任何原因(记账、锁定等)保留对数据访问的一些控制—在这种情况下,使用私有(或受保护的)setter/getter是有意义的(从代码重用和安全POV两方面来看). 但是,您不能依靠编译器发现您当时做错了什么。

一般来说,我不建议任何成员使用“私有”访问,可能是“受保护的”。通常,您或其他程序员可能在子类中需要它

冗长乏味的描述性回答

现在,对于访问器(“getter&setter”),它还取决于编程语言上属性的语法和实现

例如,C++或java,我认为没有“实际属性”,而访问器可能需要具有与属性相同的范围。(除非使用属性模板)

C#和Delphi(Lazarus)实现了属性,但是,我不喜欢C#声明ACCESOR的方式

在某些情况下,您可能希望某个属性不是公共的,可能是“受保护的”或“受包保护的”,其访问权限与该属性相同

我只是用对象Pascal编写了一些代码。大多数属性在“公共”和它的“保护者”保护下,但是,希望将代码迁移到C++或java,因此,我也使访问者“公共”。 快速简短回答


与属性具有相同的访问权限,但这取决于属性的语法。

是否认为getter和setter不是唯一可以从外部访问的部分,因此
public
?如何使另一个方法使代码更易于维护……如果您的类被扩展,并且您只使用子类中的getter/setter,那么您仍然能够控制类中的内容。它只是将结构与数据处理分离了一点。是的,我知道Java创造了这个想法,但我不是真正在Java中工作。我想我的想法是,如果你在多开发商店拥有这个类,然后您可以在您的私有setter中添加原语验证,然后其他可能扩展您的类的开发人员可以使用他们的方法来完成这些事情。它只是为了验证而强制执行基本规则。一些setter(对于相应的getter)应该是私有的。也就是说,仅仅因为可以为所有状态创建getter/setter,并不意味着应该。。我通常喜欢减少“可设置”状态,更喜欢使用较小的不可变类型和/或“操作”。如果我们谈论oop,封装是最重要的优点,或者说是第二重要的优点。有了公开的二传者,封装就被扔掉了。是的,我基本上就是这么想的。编译器无法捕获错误的示例是什么?当您创建私有或受保护的setter/getter时,这是有原因的-您甚至希望同一类的实例使用它们,而不是直接访问数据。但是,如果他们没有(因为代码的作者——可能不是类的原始实现者——忘记了这一点),编译器就无法识别这实际上是一个错误。在这种情况下,您当然可以质疑层次结构是否真的正确——这可能确实是一个暗示,它不一定是最优的。