0

我一直在阅读为什么我应该以及为什么我不应该使用 getter 和 setter 的原因。我阅读了这篇关于如何/为什么不使用 getter 和 setter 的文章 (一种设计策略),但我只是没有“看到”在什么情况下我不会使用它们,或者更好的是替代方法。是的,我需要看到一个替代 getter 和 setter 的方法。

4

5 回答 5

4

你为什么不想在声明它的类中使用它(除非它涉及一些其他业务逻辑)。我真的想不出真正的替代方案。随心所欲地称呼它,但您所做的只是声明一种获取值的方法。这只是样板代码。

此外,使用您的 API 的人会期望 getters\setters,并且在没有 getters\setters 时可能会感到困惑。

阅读全文:getter 和 setter 是否设计不佳?看到矛盾的建议

于 2013-02-12T17:31:06.343 回答
3

这是我在不到三天的时间里从 JW 那里读到的第二篇文章,他们都分享了为什么 XXXXX 是邪恶的座右铭……把它抛在脑后,我想我会引用文章的最后一句话并发表我的看法。

除非绝对必要,否则不应使用访问器方法(getter 和 setter),因为这些方法会公开有关如何实现类的信息,因此会使您的代码更难维护。有时 get/set 方法是不可避免的,但有经验的 OO 设计人员可能会毫不费力地消除代码中当前 99% 的访问器。

我相信作者指的是具体的对象,例如不与任何人交互的 POJO(为什么不是实体)。你的网站有登录功能,所以你有一个用户......你为什么要打扰,getName如果setName它只是一个String

虽然这可能是真的,但如果名称是 会发生什么null?您是否将自己暴露NullPointerException在代码周围?除非您每次使用该变量时都进行检查,或者确保没有用户拥有null您永远无法确定的名称。吸气剂可以使它变得容易,但恕我直言,这一切都与品味有关。您只是将支票从一个地方转移到另一个地方。

Getter/setter 方法经常出现在代码中,因为编码器是按程序思考的。打破这种程序性思维方式的最佳方法是根据具有明确职责的对象之间的对话进行思考。Cunningham 的 CRC 卡方法是一个很好的入门方法。

在这里,作者似乎进一步挖掘了 CRC 的原理(在文章本身中进行了解释),这是反对大多数访问者的有效论据。

同样,这一切都是关于了解您的应用程序以及您将如何让其他人知道它。我现在想不出替代方案,但我更喜欢深入研究Cost VS Benefit的概念,而不是替代方案,避免 getter 有什么好处以及避免它对您造成的成本是多少(了解变量的时间,进行检查的时间,查找字段的时间,确定和处理没有访问者限制的更改的影响的时间)。

另一个有趣的点(现在我想起来了,这是最重要的一点)是何时避免 getter 和 setter。如果你暴露了一些你不应该暴露的东西,它们显然是邪恶的,比如一些重要的变量,它持有一个计数器并且可能使你的应用程序处于不一致的状态(换句话说......“发疯”)。在这些情况下,吸气剂就足够了。

最后,许多框架和工具依赖于这些访问器来设置和获取值。避免它们意味着失去与这些工具的“兼容性”......除非您创建间接访问器或包装器,例如。

于 2013-02-12T17:42:19.183 回答
1

这是一个:

public class Point {
    public int x;
    public int y;
}

不需要 getter 和 setter,因为点的定义是 x,y 值。

像这样的构造函数将使类更易于使用。

public Point (int x, int y)

以及空的构造函数

public Point()
于 2013-02-12T17:32:15.720 回答
1

你是否使用“getters”或“setters”真的归结为一个需要的问题。例如,有一些持久性框架要求托管对象声明 getter 和 setter。一些模板框架需要它。

如果您想限制某个对象成员的可见性(从代码的角度来看),您可以为此在 getter 上使用修饰符。如果你想限制可变性,你可以在 setter 上使用修饰符。

就使用 getter/setter 而言,这并不是真正的“偏好”问题。这取决于您要实现的目标以及您正在使用的技术的要求。

于 2013-02-12T17:32:24.507 回答
1

根据我的经验:

在大多数情况下,getter setter 是最好的。

但是当在类中使用字段时,最好直接访问变量。

getter / setter 的一个缺点是在复杂的数学公式中使用时,它们的可读性较差,并且更容易出错,因为代码看起来不像文献中的公式。

例子:

 return (p2.x- p1.x) / len;

 return (p2.getX()- p1.getY()) / len;

这只是一个简单的例子。

在极少数情况下,您需要非常高性能的计算。一个例子是 java.awt.Rectangle 出于性能原因需要公开 x 和 y。但这是一个例外。

其他编程语言通过引入属性(C# 和 Objective C)解决了这个问题。它们与点语法一起使用,但在内部调用 getter 或 setter。

于 2013-02-12T17:35:33.147 回答