我一直在阅读为什么我应该这样做以及为什么我不应该使用getter和setter。我读了this article (设计策略) 关于如何/为什么不使用getter和setter但我只是没有“看到”我在什么情况下不会不要使用它们,或者更好的是另类。 是的,我需要看到吸气剂和制定者的替代品。
答案 0 :(得分:4)
为什么你不想在声明它的类中使用一个(除非它涉及一些其他业务逻辑)。我真的不能想到一个真正的选择。称之为你想要的,但你正在做的只是声明一种获取你的价值观的方法。 这只是锅炉板代码。
使用您的API的人也会期待getter \ setters,如果没有,可能会感到困惑。
有一个很好的阅读结账:Are getters and setters poor design? Contradictory advice seen
答案 1 :(得分:3)
这是我在短短三天内从JW读到的第二篇文章,他们都分享为什么XXXXX是/是邪恶的座右铭......留下它我想我会引用最后的话该文章,并提出我的意见。
除非绝对必要,否则不应使用访问器方法(getter和setter),因为这些方法会公开有关如何实现类的信息,从而使代码难以维护。有时get / set方法是不可避免的,但是经验丰富的OO设计师可能会毫不费力地消除代码中99%的访问器。
我相信作者会提到具体的对象,比如不与任何人互动的POJO(为什么不是实体)。您的网站有一个登录功能,因此您有一个用户...如果只是getName
,为什么要打扰setName
和String
?
虽然这可能是真的,如果名称是null
会发生什么?您是否将自己暴露于代码周围的NullPointerException
?除非您每次使用该变量时进行检查,或者确保没有用户具有null
名称,否则您无法确定。吸气剂可以让它变得简单,但恕我直言,这一切都与品味有关。你只是把支票从一个地方移到另一个地方。
Getter / setter方法经常在代码中出现,因为编码器在程序上进行思考。打破这种程序性思维模式的最好方法是根据具有明确责任的对象之间的对话进行思考。 Cunningham的CRC卡方法是一种很好的入门方式。
在这里,作者似乎是在CRC的原则(在文章本身中解释)进一步挖掘,这是针对大多数访问者的有效论据。
同样,这一切都是为了了解您的应用程序以及您将让其他人知道它的内容。我现在想不到另一种选择,但我更倾向于深入研究成本与效益的概念,避免吸气剂的好处是什么,避免吸收成本对你有多大帮助? (理解变量的时间,做检查的时间,找到字段的时间,确定和处理变更影响的时间,如果没有访问者限制变更的影响)。
另一个有趣的观点(现在我想起来,最重要的一点)是什么时候避免吸气者和制定者。如果你暴露了一些你不应该暴露的东西,它们显然是邪恶的,就像一个拥有计数器的重要变量并且可能使你的应用程序处于不一致状态(换句话说......“疯狂“)。在这些情况下,吸气剂就足够了。
最后,许多框架和工具依赖于这些访问器来设置和获取值。避免它们意味着失去与这些工具的“兼容性”......除非您创建间接访问器或包装器,例如。
答案 2 :(得分:1)
这是一个:
public class Point {
public int x;
public int y;
}
不需要getter和setter,因为point的定义是x,y值。
像这样的构造函数会使类更容易使用。
public Point (int x, int y)
以及空构造函数
public Point()
答案 3 :(得分:1)
你是否使用“getters”或“setter”真的归结为需要的问题。例如,有一些持久性框架需要托管对象来声明getter和setter。一些模板框架需要它。
如果要限制某个对象成员的可见性(从代码角度来看),可以在getter上使用修饰符。如果要限制可变性,可以在setter上使用修饰符。
在使用getter / setter方面,这并不是“偏好”的问题。这是您要实现的目标和您正在使用的技术要求的问题。
答案 4 :(得分:1)
根据我的经验:
在大多数情况下,吸气剂是最好的。
但是当在类中使用字段时,通常最好直接访问变量。
getter / setter的一个缺点是在复杂的数学公式中使用时, 它们的可读性较差,而且更容易产生错误,因为代码看起来不像 喜欢文学中的公式。
示例:
return (p2.x- p1.x) / len;
比
更具可读性 return (p2.getX()- p1.getY()) / len;
这只是一个简单的例子。
在极少数情况下,您需要进行非常高性能的计算。 一个例子是java.awt.Rectangle 由于性能原因,需要制作x和y。 但这是一个例外。
其他编程语言通过引入属性(C#和Objective C)解决了这个问题。它们与点语法一起使用,但在内部调用getter或setter。