为什么不直接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.mzph.cn/news/618204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查询慢 SQL 产生的原因

如何查询慢 SQL 产生的原因 &#xff08;1&#xff09;分析 SQL 执行计划&#xff08;explain extended&#xff09;&#xff0c;思考可能的优化点&#xff0c;是否命中索引等。 &#xff08;2&#xff09;没有索引或者没有用到索引(这是查询慢最常见的问题&#xff0c;是程序…

Nightingale 夜莺监控系统 - 部署篇(1)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs 目录 一、概述二、架构2.1 中心机房架构2.2 边缘下沉式混杂架构 三、环境四、部署4.1 中心机房架构部署4.1.1 MySQL4.1.2 Redis4.1.3 Prometheus4.1.4 n9e4.1.5 Categraf4.1.6 验证4.1.7 配置数据源 4…

条款23:宁以 non-member、non-friend 替换 member 函数

假设一个表示web浏览器的类&#xff1a; class WebBrowser { public:...void clearCache();void clearHistory();void removeCookies();void clearEverything(); // 调用clearCache,clearHistory,removeCookies };当然&#xff0c;这个也可以通过非成员函数调用适当的成员函数…

红队打靶练习:HOLYNIX: V1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto whatweb 目录探测 1、gobuster 2、dirsearch 3、dirb 4、feroxbuster WEB sqlmap 1、爆库 2、爆表 3、爆列 4、爆字段 后台登录 1、文件上传 2、文件包含 3、越权漏洞 反弹shell 提权 总结 信息…

Spring整理-Spring Bean的生命周期

Spring Bean的生命周期涉及多个阶段,从Bean的定义到其销毁。在这个过程中,Spring容器负责创建、初始化、使用和最终销毁Bean。了解这个生命周期有助于更好地管理Bean的行为和资源使用。 Spring Bean生命周期的主要阶段 实例化(Instantiation):容器首先创建Bean的实例。填充…

数据分析---SQL(2)

目录 SQL语句的执行顺序是什么举例说明SQL如何实现去重操作举例说明如何将时间戳转为yyyy-MM-dd形式如何将yyyy-MM-dd改为yyyyMMdd形式如何求两个yyyyMMdd形式的日期差几天SQL语句的执行顺序是什么 在SQL中,一条SQL语句的执行顺序如下: FROM子句:首先,执行FROM子句,确定要…

【Java】——期末复习题题库(九)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

matplotlib教程(一)—— 入门基础

前言 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式&#xff1b;它可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等 在使用它之前&#xff0c;应导入&#xff1a;import matp…

【 ATU 随笔记 - Inverter 】PV Inverter 太阳能逆变器市场分析

一、简介 在上一篇的介绍中与大家分享了Micro Inverter ( 微型逆变器 )的用途与特色&#xff0c;也提到 Micro Inverter 适合家庭或是一些小型企业的需求。太阳能作为再生能源的代表&#xff0c;在当今能源转型中扮演着重要角色&#xff0c;也是有大型企业、大型能源站的需求&a…

LeetCode1371. Find the Longest Substring Containing Vowels in Even Counts

文章目录 一、题目二、题解 一、题目 Given the string s, return the size of the longest substring containing each vowel an even number of times. That is, ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’ must appear an even number of times. Example 1: Input: s “ele…

C#编程-实现重写

实现重写 实现派生类中基类的成员称为重写。在C#中,可以重写方法、属性和索引器。 重写是多态性的一种形式,因为它使您能够创建具有相同名称和不同功能的不同代码块。 重写函数 在面向对象编程中,子类可以提供超类中已定义的专门版本的函数。这称为函数重写。 函数重写是…

恢复 iPhone 和 iPad 数据的 10 个好工具 - [苹果数据恢复]

它发生了.. 有时您需要从您的手机或平板设备恢复重要数据。 许多人已经开始将重要文件存储在手机上&#xff0c;因为他们几乎可以在任何情况下随时随地轻松访问数据。 不言而喻; 您可以轻松访问您的电子邮件、共享图片、编辑和共享文档、支付账单等等&#xff0c;只需在您的手…

Git LFS 大文件存储

Git 碰到大文件的困境 Git 是业界流行的分布式版本控制工具&#xff0c;本地仓库与远端仓库同样保存了全量的文件和变更历史&#xff0c;这样让代码协作变得简单和高效。但也正因为如此&#xff0c;Git针对大型文件&#xff08;例如图片、视频或其他二进制文件&#xff09;的版…

RT-Thread GD32F4xx实现SD卡热插拔检测功能

GD32F470移植RT-Thread操作系统添加SD卡功能&#xff0c;增加SD卡热插拔检测 一、RT-Thread移植sd卡功能二、实现SD卡热插拔检测原理三、软件实现过程四、延展之ASSERT ERROR&#xff0c;即RT-Thread断言错误五、延展之STM32 SD卡热插拔检测六、结束语 一、RT-Thread移植sd卡功…

最近很火的一款的低代码开发平台

目录 一、JNPF开发平台 二、JNPF界面示意图 三、技术栈展示 技术点&#xff1a; 开发环境 前后端分离 服务无状态 现在&#xff0c;很多公司在数据化的过程中&#xff0c;都需要构建很多相应的内部工具来支持他们的业务发展&#xff0c;比如运营使用的活动后台、用户管理…

鸿蒙HarmonyOS-SDK管理使用指南

鸿蒙HarmonyOS-SDK管理使用指南 文章目录 鸿蒙HarmonyOS-SDK管理使用指南sdkmgr使用指导查看SDK组件安装组件卸载组件查看sdkmgr版本查看sdkmgr帮助options选项说明 ohsdkmgr使用指导查看SDK组件安装组件卸载组件查看ohsdkmgr版本查看ohsdkmgr帮助options选项说明 sdkmgr使用指…

红队专题-Golang工具ChYing

Golang工具ChYing 招募六边形战士队员原chying工具代码分析并发访问控制并发 原子 写入读取 通道嵌套映射结构初始化启动代理服务器重启代理服务器 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 原chying工具代码分析 前有 Chying 后有…

DAY6--learning english

一、积累 1.sip She took a small sip of the hot tea to savor its delicate flavor. 她小口抿了一口热茶&#xff0c;细细品味其中的淡雅滋味。 2.vacuum Expreience the amazing cleaning power of vaccum cleaner. 体验真空吸尘器惊人的清洁能力。 3.stray Stray kitte…

RT-Thread I/O设备驱动接口

创建和注册I/O设备 驱动层负责创建设备实例&#xff0c;并注册到I/O设备管理器中&#xff0c;可以通过静态申明的方式创建设备实例&#xff0c;也可以用下面的接口进行动态创建&#xff1a; rt_device_t rt_device_create(int type, int attach_size);type&#xff1a;设备类…

伴鱼实时数仓建设案例

伴鱼实时数仓建设案例 文章目录 伴鱼实时数仓建设案例伴鱼实时作业应用场景伴鱼实时数仓的建设体系DWD 层复杂场景数据处理方案1. 数据的去重2. join场景两条实时数据流相关联对于关联历史数据 3. 从数据形态观查join DWS 数据层数据处理方案未来与展望 随着伴鱼业务的快速发展…