Java 如何不使用getter和setter

Java 如何不使用getter和setter,java,getter-setter,Java,Getter Setter,我一直在读关于为什么我应该和为什么我不应该使用getter和setter的原因。我阅读了(一种设计策略)关于如何/为什么不使用getter和setter,但我只是没有“看到”在什么情况下我不会使用它们,或者更好的是,使用替代方法是的,我需要找到一种替代getter和setter的方法。为什么不在声明它的类中使用一个呢(除非它涉及其他业务逻辑)。我真的想不出真正的替代方案。你可以随意调用它,但你所做的只是声明一个方法来获取你的值。 这只是锅炉铭牌代码 此外,使用您的API的人会期望使用getter

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

为什么不在声明它的类中使用一个呢(除非它涉及其他业务逻辑)。我真的想不出真正的替代方案。你可以随意调用它,但你所做的只是声明一个方法来获取你的值。 这只是锅炉铭牌代码

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

要想了解更多信息,请查看:

这里有一个:

public class Point {
    public int x;
    public int y;
}
不需要getter和setter,因为点的定义是x,y值

这样的构造函数会使类更易于使用

public Point (int x, int y)
以及空构造函数

public Point()
是否使用“getter”或“setter”实际上是一个需要的问题。例如,有些持久性框架要求托管对象声明getter和setter。一些模板框架需要它

如果要限制某个对象成员的可见性(从代码的角度),可以在getters上使用修饰符。如果要限制可变性,可以在setter上使用修饰符


就使用getter/setter而言,这实际上不是“偏好”的问题。这是一个你试图实现的目标和你正在使用的技术的要求的问题。

根据我的经验:

实际上,在大多数情况下,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。

这是我在不到三天的时间里从JW上读到的第二篇文章,它们都分享了为什么XXXXX是/是邪恶的座右铭。。。撇开这一点不谈,我想我会引用这篇文章的最后几句话,并给出我的看法

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

我相信作者指的是具体的对象,比如POJO(为什么不是实体),它不与任何人交互。你的网站有一个登录功能,所以你有一个用户。。。如果它只是一个
字符串
,为什么还要麻烦处理
getName
setName

虽然这可能是真的,但如果名称为
null
,会发生什么情况?您是否将自己暴露在代码周围的
NullPointerException
s中?除非每次使用该变量时都进行检查,或者确保没有用户具有
null
名称,否则您永远无法确定。一个能干的人可以让事情变得简单,但我认为这一切都是为了品味。你只是把支票从一个地方移到另一个地方

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

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

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

另一个有趣的问题(现在我想起来了,这是最重要的问题之一)是什么时候应该避免getter和setter。如果你公开了一些你不应该公开的东西,比如某个重要的变量,它持有一个计数器,可能会让你的应用程序处于不一致的状态(换句话说……“发疯”),它们显然是邪恶的.在这种情况下,一个getter就足够了


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

重复:默认情况下不应该有getter或setter,除非(i)您必须这样做,因为外部框架希望找到它们,或者(ii)公开类的一些内部内容是有意义的。@Aprit这不是重复的。我读了很多遍。这是如何不使用它们。如果你反对投票,请说明原因。谢谢。Zarkonnen有一个关于为什么/如何不使用它们的很好且简单的例子。其他评论者也有很好的见解。阅读本文后这篇文章更让我开始明白这是什么意思