3 回答
TA贡献1943条经验 获得超7个赞
基本的“带有公共获取器和设置器的私有字段,除了返回或设置字段之外什么都不做”模式在封装方面确实是毫无意义的,除了它为您提供了以后无需更改API即可对其进行更改的机会。
因此,请不要随意使用该模式。仔细考虑您实际需要的操作。
getter和setter的真正意义在于,仅应在适当的地方使用它们,并且它们不仅可以获取和设置字段,还可以做更多的事情。
你只能有一个吸气剂。然后,该属性为只读。实际上,这应该是最常见的情况。
您只能有一个setter,使该属性可配置,但要传达的是,其他任何内容都不应该取决于它的值
一个getter可以从多个字段计算一个值,而不是返回一个字段。
吸气剂可以制作防御性副本
吸气剂可以延迟执行昂贵的获取操作,并使用字段来缓存值
设置员可以进行健全性检查并抛出
IllegalArgumentException
设置员可以将值的更改通知侦听器
您可以有一个将多个字段设置在一起的设置器,因为它们在概念上属于在一起。这不符合JavaBeans规范,因此如果您依赖期望JavaBeans的框架或工具,则不要这样做。否则,这是一个有用的选项。
所有这些都是隐藏在简单的“ getter and setter”界面后面的实现细节。这就是封装的意义。
TA贡献1836条经验 获得超5个赞
getter和setter的想法是控制对类中变量的访问。这样,如果需要在内部更改值以其他方式表示,则可以这样做,而无需破坏类外的任何代码。
例如,假设您有一个带有距离变量的类,并且以英寸为单位进行测量。几个月过去了,您在许多地方都使用了此类,突然意识到您需要以厘米为单位来表示该值。如果您不使用getter和setter,则必须跟踪该类的每次使用并在那里进行转换。如果使用了getter和setter,则只需更改这些方法,使用该类的所有内容都不会中断。
public class Measurement
{
/**
* The distance in centimeters.
*/
private double distance;
/**
* Gets the distance in inches.
* @return A distance value.
*/
public double getDistance()
{
return distance / 2.54;
}
/**
* Sets the distance.
* @param distance The distance, in inches.
*/
public void setDistance(double distance)
{
this.distance = distance * 2.54;
}
}
TA贡献1847条经验 获得超11个赞
这是不利的一面。Getters / Setters倾向于将类的实现细节向外界公开。那不是好事。假设您正在编写一个Auto Mechanic软件包。因此,您将需要一个Car类,因此您需要公开字段的getter和setter方法。
Date lastOilChangeDate;
int lastOilChangeMileage;
在这个班上。这是因为该软件希望在客户汽车需要换油时发送电子邮件。
但是,当新车问世时,您确定汽车是否需要换油,而不是“每3000英里或3个月”,会发生什么?也许这些新车的油底壳中有一个传感器,可以测量脏度。显然,您希望使用它来确定是否需要换油。
问题是您在使用这些吸气剂/装料器解决了错误的问题。没有人真正想知道上一次换油的时间,他们想知道您是否需要另一次换油。它们只是实现细节,但您已将它们作为界面的一部分。您应该做的是添加了一种方法
public boolean needsOilChange()
然后Car类可以按需实现。如果更改算法,则不需要Mechanic类,因为它所需要的只是needsOilChange方法。
添加回答
举报