当前位置: 首页 > news >正文

为什么不直接public,多此一举用get、set,一文给你说明白

文章目录

    • 1. 封装性(Encapsulation)
    • 2. 验证与逻辑处理
    • 3. 计算属性(Computed Properties)
    • 4. **跟踪变化(Change Tracking)
    • 5. 懒加载与延迟初始化(Lazy Initialization)
    • 6. 兼容性与未来扩展
    • 上代码实例说明

使用 getset访问器(也称为属性)而不是直接将类成员变量声明为 public,有以下几个关键好处:

1. 封装性(Encapsulation)

  • 封装是面向对象编程中的基本原则之一。通过将字段声明为私有(private)并提供公共的getset方法,可以控制对这些字段的外部访问。这样,类内部可以隐藏其数据实现细节,外部代码不能随意修改或查看这些字段的值,从而提高了数据的安全性和完整性。

2. 验证与逻辑处理

  • set访问器中,可以添加必要的验证逻辑,在设置字段值之前检查新值的有效性。例如,确保年龄不小于0,邮箱地址格式正确等。如果直接公开字段,就无法在赋值时进行这种控制。

3. 计算属性(Computed Properties)

  • get方法可以用于返回基于多个私有字段或其他复杂逻辑计算得出的值,而不只是简单的字段读取。

4. **跟踪变化(Change Tracking)

  • 当属性值发生变化时,可以在set方法内触发额外的操作,如通知其他组件属性已更新,或者记录属性更改历史。

5. 懒加载与延迟初始化(Lazy Initialization)

  • 可以利用get方法实现懒加载,即只有在首次访问属性时才执行初始化操作,这有助于优化性能。

6. 兼容性与未来扩展

  • 如果将来需要更改存储字段的方式(例如从一个简单字段变为一个复杂的计算结果或从数据库获取),只需修改属性的getset实现即可,无需改变所有访问该属性的客户端代码。

直接将类成员变量声明为public虽然可以简单地实现对这些变量的读写操作,但会导致以下问题:

上代码实例说明

假设有一个 Person 类,其中包含年龄(age)属性。

// 直接使用 public 成员变量的例子
public class PersonWithoutGetSet {public int age;
}

在上面的例子中,任何访问到这个 PersonWithoutGetSet 对象的地方都可以随意修改其年龄,甚至可能会出现不合理的情况,例如:

PersonWithoutGetSet person = new PersonWithoutGetSet();
person.age = -10; // 任何人都可以直接设置一个负数作为年龄,这是不合理的

现在我们使用 getset 方法来改进这个问题:

public class PersonWithGetSet {private int age;public int getAge() {return this.age;}public void setAge(int newAge) {if (newAge >= 0 && newAge <= 150) { // 添加了合理性验证逻辑this.age = newAge;} else {throw new IllegalArgumentException("Age must be between 0 and 150.");}}
}

在这个例子中,通过 setAge() 方法,我们可以确保传入的年龄值是合理的。如果外部尝试设置一个非法的年龄值,将会抛出异常,而不是任由数据错误发生。

此外,将来如果需要在赋值时触发额外的操作,比如更新相关的数据库记录或者触发状态改变事件等,可以在 setAge() 方法内部添加相应的代码,而无需改动调用该方法的所有地方。

因此,使用 getset 方法能够增强封装性、提供数据验证以及支持未来的功能扩展,这些都是直接使用 public 变量无法带来的好处。

综上所述,虽然直接使用public字段提供了简洁的访问方式,但在实际开发中,尤其是在设计稳健、可维护的软件系统时,使用getset属性能更好地实现数据封装,增强代码的稳定性和灵活性。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

http://www.lryc.cn/news/279799.html

相关文章:

  • golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞
  • 【Postman-windows-9.12.2版本安装与汉化】
  • 11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)
  • Grafana Promtail 配置解析
  • 电脑DIY-主板参数
  • JVM知识总结(持续更新)
  • 信息系统安全——基于 KALI 和 Metasploit 的渗透测试
  • 05. 深入理解 GPT 架构
  • PHP开发日志 ━━ php8.3安装与使用组件Xdebug
  • Python - 深夜数据结构与算法之 Two-Ended BFS
  • langchain-Agent-工具检索
  • 猫头虎分享:探索TypeScript的世界 — TS基础入门 ‍
  • Unity-生命周期函数
  • SQL概述及SQL分类
  • [VSCode] VSCode 常用快捷键
  • 函数指针和回调函数 以及指针函数
  • 京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单
  • 秒懂百科,C++如此简单丨第十二天:ASCLL码
  • Qt6入门教程 4:Qt Creator常用技巧
  • 阴盘奇门八字排盘马星位置计算方法php代码
  • vue3 使用 jsoneditor
  • 若依前后端分离版使用mybatis-plus实践教程
  • SpringBoot-Dubbo-Zookeeper
  • 华为HCIE课堂笔记第十二章 ICMPv6和NDP协议
  • GNSS科研常用相关网站及资源
  • 进程的创建与回收学习笔记
  • 【CCNet】《CCNet:Criss-Cross Attention for Semantic Segmentation》
  • Qt QSQlite数据库插入字符串中存在单个双引号或单个单引号解决方案
  • Linux系统中的IP地址、主机名、和域名解析
  • soc算法【周末总结】