我一直被教导要始终使用getter和setter。然而,我不知道这些方法的优缺点,因为通过实现它们,我们既暴露了数据,又隐藏了数据。
我对此有些困惑。有人能够给出关于为什么使用getter/setter以及其优势的适当建议吗?
我一直被教导要始终使用getter和setter。然而,我不知道这些方法的优缺点,因为通过实现它们,我们既暴露了数据,又隐藏了数据。
我对此有些困惑。有人能够给出关于为什么使用getter/setter以及其优势的适当建议吗?
基本的“私有字段和公共getter和setter”模式在封装方面确实是完全无意义的,除了它给你一个机会稍后更改而不更改API。
因此,请不要盲目使用该模式。仔细考虑您实际需要哪些操作。
getter和setter的真正重点在于只在适当的情况下使用它们,并且它们可以做更多的事情,而不仅仅是获取和设置字段。
IllegalArgumentException
所有这些都是隐藏在简单的“getter和setter”接口背后的实现细节。这就是封装的含义。
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;
}
}
其中一个好处是,您可以通过不实现该字段的setter方法来使字段变为只读ReadOnly。
以下是缺点。Getter和Setter往往会将你的类的实现细节暴露给外界,这不是好事。想象一下你正在编写汽车维修软件包。因此,你需要一个Car类,并且要对字段公开Getter和Setter。
Date lastOilChangeDate;
int lastOilChangeMileage;
public boolean needsOilChange()
接着,Car类可以按照它想要实现的方式实现。如果算法更改,则Mechanic类不需要更改,因为它只需要needsOilChange方法。
使用getter和setter没有任何问题-只需要注意,通过使用它们并将它们全部设置为public,您会暴露您的变量,并在某种程度上违反了封装。这就是您提到的文章试图警告的内容-不要仅仅自动生成所有私有实例变量的getter和setter;考虑一下您想要向其他类公开什么(以及在什么级别,即private/protected/public),这样您只暴露必要的内容。
这主要用于像下面这样的Java bean。
public Class MyBean{
private int var1;
public void setVar1(int pVar1){
this.var1=pvar1;
}
public int getVar1() {
return var1;
}
}
好处如下:
1. 我们可以实现封装
2. 它被称为 DTO(数据传输对象) 设计模式。 它用于在基于MVC的应用程序中从一层传递数据到另一层。 例如,您可以通过使用getter从表单获取用户输入的数据,然后使用相同的数据插入到数据库中(使用setter),反之亦然。 最新的框架(Spring)提供了内置功能。