为什么在java中getter和setter方法很重要?
我被教导总是使用getter和setter。 但是,我不知道这些方法的优缺点,因为通过实施这些方法,我们正在暴露数据并隐藏数据。
我对此有点困惑。 有人可以给我们一些适当的build议,为什么我们使用getter / setter和什么好处?
除了在不改变API的情况下,让你有机会在晚些时候改变它,基本的“公用getter和setter只能返回或设置字段”模式的私有领域在封装方面确实是毫无意义的。
所以不要不假思索地使用这个模式。 仔细考虑你实际需要的操作。
获得者和制定者的真正意义在于,你只能在适当的地方使用它们,而不仅仅是获取和设置字段。
- 你只能有一个getter。 那么这个属性是只读的。 这实际上应该是最常见的情况。
- 你可以只有一个setter,使财产可configuration,但沟通,没有别的应该取决于其价值
- 吸气剂可以从几个字段计算出一个值,而不是返回一个字段。
- 吸气剂可以制造防御性的副本
- 一个getter可以执行一个昂贵的提取操作,并且使用一个字段caching这个值
- 二传手可以做健康检查,并抛出
IllegalArgumentException
- setter可以通知监听器对值的更改
- 你可以有一个设置多个领域,因为他们在一起概念上在一起。 这不符合JavaBeans规范,所以如果您依赖期望JavaBean的框架或工具,请不要这样做。 否则,这是一个有用的select。
所有这些东西都是隐藏在简单的“getter和setter”接口背后的实现细节。 封装就是这样的。
getter和setter的概念是控制对类中variables的访问。 这样,如果值需要在内部更改以不同的方式表示,您可以在不破坏课程外的任何代码的情况下这样做。
例如,假设您有一个带有距离variables的类,并以英寸为单位进行测量。 几个月过去了,你在很多地方使用这个类,你突然意识到你需要以厘米来表示这个值。 如果你没有使用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; } }
想到的一个好的优点是你可以通过不为这个特定的字段实现一个setter来创build一个ReadOnly字段。
使用 getter和setter没有什么问题 – 只要注意, 通过 使用 getter和setter来让它们公开,你就可以暴露你的variables,并且在某种程度上违反了封装。 这就是你提到的文章试图警告 – 不要只为所有私有实例variables自动生成getter和setter; 想想你想暴露给其他类(以及在什么级别,即私人/保护/公共),以便只在需要时才公开。
这是不利的一面。 Getters / Setter倾向于将你的课程的实现细节暴露给外部世界。 这不是一件好事。 想象一下,你正在写一个汽车修理工软件包。 因此,你将需要一个Car类,所以你暴露了领域的getter和setter
Date lastOilChangeDate; int lastOilChangeMileage;
在这个class上 这是因为软件希望在客户车辆需要换油时发送电子邮件。
但是当新车出现在你确定一辆汽车是否需要换油的方式比“每隔3000英里还是3个月”还要不同的时候呢? 也许这些新车在油底壳里有一个传感器,用来测量脏污。 显然你会想用这个来确定是否需要换油。
问题是你正在解决与这些getter / setter错误的问题。 没有人真的想知道最后一次换油是什么时候,他们想知道你是否需要另一个。 他们只是实现的细节,但是你把它们变成了界面的一部分。 你应该做的是添加了一个方法
public boolean needsOilChange()
然后Car类可以实现它想要的。 如果algorithm改变,Mechanic类不需要,因为它只需要needsOilChange方法。
这主要用在下面的Java bean中。
public Class MyBean{
private int var1;
public void setVar1(int pVar1){
this.var1=pvar1;
}
public int getVar1(){
返回var1;`
}
}
好处如下
用这个我们可以实现封装
2.它被称为DTO(数据传输对象)devise模式。 它用于在基于MVC的应用程序中将数据从一个层传输到另一个层。 像你可以从表单(通过使用getter)获得用户input的数据,你可以使用相同的数据插入到数据库(通过使用setter)和副verca。 最新的框架(SPring)将其作为内置function提供。