2

在类中编写 getter/setter 时,setter是否应该是私有方法?

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

4

4 回答 4

5

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

如果您的二传手是私人的,那么您就错过了重点。这就像在你的房子里有一扇门总是关闭的,甚至不允许打开。同样在类中,您可以直接访问该字段,为什么要在那里使用 setter?

当然,真正的问题是:我们应该有二传手吗?如今,典型的类包含一堆字段、自动生成的 getter/setter 并且没有逻辑。这几乎不是一堂课。它只是一种访问元素的笨拙方式的结构。但这不是你所要求的。

于 2012-10-31T19:32:53.600 回答
3

一般来说,我不建议任何成员进行“私人”访问,也许是“受保护”。通常,您或其他程序员可能在后代类中需要它。

长无聊的描述性答案

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

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

C# & Delphi (Lazarus) 实现了属性,但是,我不喜欢 C# 声明访问器的方式。

在某些情况下,您可能希望某个属性不公开,可能是“受保护”或“包保护”,以及它的访问者,与该属性具有相同的访问权限。

我只是在 Object Pascal 中编写一些代码。大多数“公共”属性及其访问者“受保护”,但是,想要将该代码迁移到 C++ 或 Java,因此,我也将访问者设为“公共”。

快速简短的回答

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

于 2012-10-31T20:21:38.003 回答
1

如果目的是允许从外部对象操纵它们,它们应该是公开的。这就是 POJO 实现的重点。(http://en.wikipedia.org/wiki/Plain_Old_Java_Object)

如果您希望实现一些其他模式,也许查看 Java Access Modifiers 上的文档应该是您的第一站(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)

于 2012-10-31T19:35:49.200 回答
1

通常您希望 setter/getter 是公开的,因为这就是它们的用途:授予对数据的访问权限,您不想让其他人直接访问,因为您不希望他们弄乱您的实现相关细节 - 这就是封装是关于。

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

于 2012-10-31T19:48:45.303 回答