导读:本期聚焦于小伙伴创作的《Java中getter和setter正确使用指南:Thermostat类封装实践》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中getter和setter正确使用指南:Thermostat类封装实践》有用,将其分享出去将是对创作者最好的鼓励。

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方法中添加逻辑即可,不需要修改所有调用该属性的代码。

Java封装 Thermostat类 Getter方法 Setter方法 面向对象编程

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。