3 回答
TA贡献1963条经验 获得超6个赞
Set和Get方法是数据封装的一种模式。您可以定义get访问这些变量的set方法以及修改它们的方法,而不是直接访问类成员变量。通过以这种方式封装它们,您可以控制公共接口,以备将来需要更改类的内部工作方式时使用。
例如,对于成员变量:
Integer x;
您可能有以下方法:
Integer getX(){ return x; }
void setX(Integer x){ this.x = x; }
Chiccodoro还提到了一个重要的观点。如果您只想允许任何外部类对该字段进行读取访问,则可以通过仅提供公共get方法并保留set私有方法或完全不提供a 来做到这一点set。
TA贡献1801条经验 获得超8个赞
我想添加到其他答案中,可以使用setter防止对象处于无效状态。
例如,假设我们必须设置一个建模为String的TaxId。setter的第一个版本可以如下:
private String taxId;
public void setTaxId(String taxId) {
this.taxId = taxId;
}
但是,我们最好防止使用无效的taxId设置对象,因此我们可以进行检查:
private String taxId;
public void setTaxId(String taxId) throws IllegalArgumentException {
if (isTaxIdValid(taxId)) {
throw new IllegalArgumentException("Tax Id '" + taxId + "' is invalid");
}
this.taxId = taxId;
}
下一步,要改善程序的模块化,是使TaxId本身成为一个对象,能够对其进行检查。
private final TaxId taxId = new TaxId()
public void setTaxId(String taxIdString) throws IllegalArgumentException {
taxId.set(taxIdString); //will throw exception if not valid
}
同样对于获取者,如果我们还没有价值怎么办?也许我们想走一条不同的道路,我们可以这样说:
public String getTaxId() throws IllegalStateException {
return taxId.get(); //will throw exception if not set
}
TA贡献1828条经验 获得超6个赞
我想你想要这样的东西:
public class Person {
private int age;
//public method to get the age variable
public int getAge(){
return this.age
}
//public method to set the age variable
public void setAge(int age){
this.age = age;
}
}
您只是在对象实例上调用这种方法。这种方法特别有用,特别是在设置某些东西会产生副作用的情况下。例如,如果您想对某些事件做出反应,例如:
public void setAge(int age){
this.age = age;
double averageCigarettesPerYear = this.smokedCigarettes * 1.0 / age;
if(averageCigarettesPerYear >= 7300.0) {
this.eventBus.fire(new PersonSmokesTooMuchEvent(this));
}
}
当然,如果有人忘记打电话给setAge(int)他应该去的地方并age直接使用进行设置,这将很危险this.age。
添加回答
举报