Java中Thermostat类getter和setter方法的正确使用
在Java面向对象编程中,封装是核心特性之一。通过将类的属性设置为私有,再提供公共的getter和setter方法控制属性的访问和修改,可以保证数据的安全性和合理性。本文以Thermostat(恒温器)类为例,讲解如何正确使用getter和setter方法控制属性访问。
一、Thermostat类的核心属性分析
恒温器的核心属性通常包括当前温度、目标温度、工作状态(开启/关闭)、温度单位(摄氏度/华氏度)等。这些属性需要遵循以下约束:
当前温度和目标温度不能为负数,且需要在合理区间(如-50℃到100℃)
工作状态只能通过特定的方法修改,不能直接随意设置
温度单位修改时需要同步转换对应的温度值
二、基础版Thermostat类实现
首先我们定义私有属性,再为每个属性提供对应的getter和setter方法,在setter中添加合法性校验逻辑:
public class Thermostat {
// 私有属性,外部无法直接访问
private double currentTemp;
private double targetTemp;
private boolean isOn;
private String tempUnit; // 温度单位,仅支持"CELSIUS"或"FAHRENHEIT"
// 构造方法,初始化默认状态
public Thermostat() {
this.currentTemp = 25.0;
this.targetTemp = 26.0;
this.isOn = false;
this.tempUnit = "CELSIUS";
}
// currentTemp的getter方法
public double getCurrentTemp() {
return currentTemp;
}
// currentTemp的setter方法,添加合法性校验
public void setCurrentTemp(double currentTemp) {
if (currentTemp < -50 || currentTemp > 100) {
throw new IllegalArgumentException("当前温度需在-50到100之间");
}
this.currentTemp = currentTemp;
}
// targetTemp的getter方法
public double getTargetTemp() {
return targetTemp;
}
// targetTemp的setter方法,添加合法性校验
public void setTargetTemp(double targetTemp) {
if (targetTemp < -50 || targetTemp > 100) {
throw new IllegalArgumentException("目标温度需在-50到100之间");
}
this.targetTemp = targetTemp;
}
// isOn的getter方法
public boolean isOn() {
return isOn;
}
// isOn的setter方法,限制状态修改逻辑
public void setOn(boolean on) {
this.isOn = on;
if (on) {
System.out.println("恒温器已开启,当前目标温度:" + targetTemp + " " + tempUnit);
} else {
System.out.println("恒温器已关闭");
}
}
// tempUnit的getter方法
public String getTempUnit() {
return tempUnit;
}
// tempUnit的setter方法,修改单位时同步转换温度值
public void setTempUnit(String tempUnit) {
if (!"CELSIUS".equals(tempUnit) && !"FAHRENHEIT".equals(tempUnit)) {
throw new IllegalArgumentException("温度单位仅支持CELSIUS或FAHRENHEIT");
}
// 如果单位变更,需要转换当前温度和目标温度
if (!this.tempUnit.equals(tempUnit)) {
if ("CELSIUS".equals(tempUnit)) {
// 华氏度转摄氏度
this.currentTemp = (this.currentTemp - 32) * 5 / 9;
this.targetTemp = (this.targetTemp - 32) * 5 / 9;
} else {
// 摄氏度转华氏度
this.currentTemp = this.currentTemp * 9 / 5 + 32;
this.targetTemp = this.targetTemp * 9 / 5 + 32;
}
this.tempUnit = tempUnit;
}
}
}三、getter和setter的使用规范
在使用上述Thermostat类时,需要遵循以下规范:
不要直接访问类的私有属性,统一通过getter获取属性值,通过setter修改属性值
setter方法中已经包含了合法性校验,调用时无需重复校验,若传入非法值会抛出异常
布尔类型的属性,getter方法通常用
isXxx()形式,而非getXxx()
以下是使用Thermostat类的示例代码:
public class ThermostatTest {
public static void main(String[] args) {
Thermostat thermostat = new Thermostat();
// 通过getter获取初始状态
System.out.println("初始状态:是否开启:" + thermostat.isOn() + ",当前温度:" + thermostat.getCurrentTemp() + " " + thermostat.getTempUnit());
// 通过setter修改工作状态
thermostat.setOn(true);
// 通过setter修改目标温度,传入合法值
thermostat.setTargetTemp(28.0);
System.out.println("修改后目标温度:" + thermostat.getTargetTemp() + " " + thermostat.getTempUnit());
// 尝试传入非法温度,会抛出异常
try {
thermostat.setCurrentTemp(120.0);
} catch (IllegalArgumentException e) {
System.out.println("设置失败:" + e.getMessage());
}
// 修改温度单位,会自动转换温度值
thermostat.setTempUnit("FAHRENHEIT");
System.out.println("修改单位后当前温度:" + thermostat.getCurrentTemp() + " " + thermostat.getTempUnit());
System.out.println("修改单位后目标温度:" + thermostat.getTargetTemp() + " " + thermostat.getTempUnit());
}
}四、常见使用误区
在实际开发中,使用getter和setter时容易出现以下误区,需要避免:
不要在getter方法中修改属性值:getter的职责是返回属性当前值,不应该包含修改逻辑,否则会导致代码可读性下降,调试困难
不要在setter方法中返回属性值:setter的职责是修改属性,除非是链式调用场景,否则不建议返回this,避免混淆方法用途
不要为所有属性都无脑生成getter和setter:如果某个属性不需要被外部修改,就只提供getter,不提供setter,比如恒温器的设备序列号,通常只在初始化时设置,后续不允许修改
例如,如果Thermostat类有一个设备序列号属性serialNumber,正确的定义方式如下:
public class Thermostat {
private String serialNumber;
public Thermostat(String serialNumber) {
this.serialNumber = serialNumber;
}
// 仅提供getter,不提供setter,保证序列号不可修改
public String getSerialNumber() {
return serialNumber;
}
}五、总结
正确使用getter和setter方法,核心是保证封装性的同时,通过方法内部的逻辑控制属性的访问和修改规则。对于Thermostat类来说,所有属性修改都通过setter完成,所有属性读取都通过getter完成,既保证了数据的合法性,也让代码的维护成本更低。如果后续需要添加新规则,比如温度波动超过阈值时触发报警,只需要在对应的setter方法中添加逻辑即可,不需要修改所有调用该属性的代码。