当前位置: 首页 > 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)
————————————————

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

相关文章:

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

文章目录 1. 封装性&#xff08;Encapsulation&#xff09;2. 验证与逻辑处理3. 计算属性&#xff08;Computed Properties&#xff09;4. **跟踪变化&#xff08;Change Tracking&#xff09;5. 懒加载与延迟初始化&#xff08;Lazy Initialization&#xff09;6. 兼容性与未来…...

golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞

前言 在实习的项目中有一个地方遇到了需要协程池的地方&#xff0c;在mt推荐下使用了ants库。因此在此篇记录一下自己学习使用此库的情况。 场景描述 此服务大致是一个kafka消息接收、发送相关。接收消息&#xff0c;根据参数设置定时器进行重发。 通过这里新建kafka服务&a…...

【Postman-windows-9.12.2版本安装与汉化】

Postman-windows-9.12.2版本安装与汉化 想用英文版本的可以直接点击如下链接下载最新版本 官网最新版本(无法汉化)&#xff1a;https://www.postman.com/downloads/ 如果想要汉化的就不能使用最新版本&#xff0c;因为最新版本没有汉化包可以用 汉化包和postman的版本必须是…...

11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)

1负责注入的注解 负责注入的注解&#xff0c;常见的包括四个&#xff1a; ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时&#xff0c;可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…...

Grafana Promtail 配置解析

由于目前项目一般都是部署在k8s上&#xff0c;因此这篇文章中的配置只摘录k8s相关的配置&#xff0c;仅供参考&#xff0c;其他的配置建议上官网查询。 运行时打印配置 -print-config-stderr 通过 ./promtail 直接运行Promtail时能够快速输出配置 -log-config-reverse-order 配…...

电脑DIY-主板参数

电脑主板参数 主板系列芯片组主板支持的CPU系列主板支持CPU的第几代主板的尺寸主板支持的内存主板是否支持专用WIFI模块插槽主板规格主板供电规格M.2插槽&#xff08;固态硬盘插槽&#xff09;规格USB接口规格质保方式 华硕TUF GAMING B650M-PLUS WIFI DDR5重炮手主板 华硕&…...

JVM知识总结(持续更新)

这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区 java内存区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域&#xff1a; 程序计数器虚拟机栈本地方法栈堆方法区 程序计数器 记录下一条需要执行的虚拟机字节码指令…...

信息系统安全——基于 KALI 和 Metasploit 的渗透测试

实验 2 基于 KALI 和 Metasploit 的渗透测试 2.1 实验名称 《基于 KALI 和 Metasploit 的渗透测试》 2.2 实验目的 1 、熟悉渗透测试方法 2 、熟悉渗透测试工具 Kali 及 Metasploit 的使用 2.3 实验步骤及内容 1 、安装 Kali 系统 2 、选择 Kali 中 1-2 种攻击工具&#xff0c…...

05. 深入理解 GPT 架构

在本章的前面,我们提到了类 GPT 模型、GPT-3 和 ChatGPT 等术语。现在让我们仔细看看一般的 GPT 架构。首先,GPT 代表生成式预训练转换器,最初是在以下论文中引入的: 通过生成式预训练提高语言理解 (2018) 作者:Radford 等人,来自 OpenAI,http://cdn.openai.com/rese…...

PHP开发日志 ━━ php8.3安装与使用组件Xdebug

今天开头写点历史&#xff1a; 二十年前流行asp&#xff0c;当时用vb整合常用函数库写了一个dll给asp调用&#xff0c;并在此基础上开发一套仿windows界面的后台管理系统&#xff1b;后来asp逐渐没落&#xff0c;于是在十多年前转投php&#xff0c;不久后用php写了一套mvc框架&…...

Python - 深夜数据结构与算法之 Two-Ended BFS

目录 一.引言 二.双向 BFS 简介 1.双向遍历示例 2.搜索模版回顾 三.经典算法实战 1.Word-Ladder [127] 2.Min-Gen-Mutation [433] 四.总结 一.引言 DFS、BFS 是常见的初级搜索方式&#xff0c;为了提高搜索效率&#xff0c;衍生了剪枝、双向 BFS 以及 A* 即启发式搜索…...

langchain-Agent-工具检索

有时会定义很多工具&#xff0c;而定义Agent的时候只想使用与问题相关的工具&#xff0c;这是可以通过向量数据库来检索相关的工具&#xff0c;传递给Agent # Define which tools the agent can use to answer user queries search SerpAPIWrapper() search_tool Tool(name …...

猫头虎分享:探索TypeScript的世界 — TS基础入门 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…...

Unity-生命周期函数

目录 生命周期函数是什么&#xff1f; 生命周期函数有哪些&#xff1f; Awake() OnEnable() Start() FixedUpdate() Update() Late Update() OnDisable() OnDestroy() Unity中生命周期函数支持继承多态吗&#xff1f; 生命周期函数是什么&#xff1f; 在Unity中&…...

SQL概述及SQL分类

SQL由IBM上世纪70年代开发出来&#xff0c;是使用关系模型的数据库应用型语言&#xff0c;与数据直接打交道。 SQL标准 SQL92,SQL99&#xff0c;他们分别代表了92年和99年颁布的SQL标准&#xff0c;我们今天使用的SQL语言依旧遵循这些标准。 SQL的分类 DDL&#xff1a;数据定…...

[VSCode] VSCode 常用快捷键

文章目录 VSCode 源代码编辑器VSCode 常用快捷键分类汇总01 编辑02 导航03 调试04 其他05 重构06 测试07 扩展08 选择09 搜索10 书签11 多光标12 代码片段13 其他 VSCode 源代码编辑器 官网&#xff1a;https://code.visualstudio.com/ 下载地址&#xff1a;https://code.visua…...

函数指针和回调函数 以及指针函数

函数指针&#xff08;Function Pointer&#xff09;&#xff1a; 定义&#xff1a; 函数指针是指向函数的指针&#xff0c;它存储了函数的地址。函数的二制制代码存放在内存四区中的代码段&#xff0c;函数的地址它在内存中的开始地址。如果把函数的地址作为参数&#xff0c;就…...

京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单

同笔记本市场类似&#xff0c;2023年度游戏本市场的整体销售也呈下滑态势。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;京东平台上游戏本的年度销量累计超过350万&#xff0c;同比下滑约6%&#xff1b;销售额将近270亿&#xff0c;同比下滑约11%。 鲸参谋综合了京东…...

秒懂百科,C++如此简单丨第十二天:ASCLL码

目录 必看信息 Everyday English &#x1f4dd;ASCLL码是什么&#xff1f; &#x1f4dd;ASCLL码表 &#x1f4dd;利用ASCLL码实现大写转小写 &#x1f4dd;小试牛刀 总结 必看信息 ▶本篇文章由爱编程的小芒果原创&#xff0c;未经许可&#xff0c;严禁转载。 ▶本篇文…...

Qt6入门教程 4:Qt Creator常用技巧

在上一篇Qt6入门教程 3&#xff1a;创建Hello World项目中&#xff0c;通过创建一个Qt项目&#xff0c;对Qt Creator已经有了比较直观的认识&#xff0c;本文将介绍它的一些常用技巧。 Qt Creator启动后默认显示欢迎页面 创建项目已经用过了&#xff0c;打开项目也很简单&#…...

零基础快速上手:免费开源H5编辑器h5maker完全指南

零基础快速上手&#xff1a;免费开源H5编辑器h5maker完全指南 【免费下载链接】h5maker h5编辑器类似maka、易企秀 账号/密码&#xff1a;admin 项目地址: https://gitcode.com/gh_mirrors/h5/h5maker 想要轻松制作专业级H5页面却苦于技术门槛&#xff1f;h5maker作为一…...

3000 字深度拆解:Paperxie AI 期刊写作界面全解析 —— 科研人必看的 “投刊效率密码”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/期刊论文https://www.paperxie.cn/ai/journalArticleshttps://www.paperxie.cn/ai/journalArticles 一、引言&#xff1a;科研人的投稿困局&#xff0c;藏在每一个被忽略的界面细节里 当科研人熬过无数个深…...

汽车电子工程师必看:如何用MPC5643L实现ASIL-D级别的功能安全设计(附完整代码示例)

汽车电子工程师必看&#xff1a;如何用MPC5643L实现ASIL-D级别的功能安全设计&#xff08;附完整代码示例&#xff09; 在智能驾驶技术快速发展的今天&#xff0c;功能安全已成为汽车电子系统设计的核心考量。作为汽车电子工程师&#xff0c;我们面临的挑战不仅在于实现复杂功…...

STM32危化品智能管理系统设计与实现

## 1. 项目概述### 1.1 系统背景 实验室危化品管理面临传统人工记录方式效率低下、易出错等问题&#xff0c;特别是在温湿度敏感、易燃易爆或有毒危化品的存储过程中存在重大安全隐患。基于STM32F103C8T6微控制器的智能管理系统通过集成多参数传感、无线通信和云平台技术&#…...

掌握 AgentScope 与 Spring AI Alibaba:大模型多智能体实践指南(收藏版)

本文深入探讨了 AgentScope 与 Spring AI Alibaba 在大模型应用中的多智能体实践。从单智能体优先原则出发&#xff0c;详细解析了 Pipeline、Routing、Skills、Subagents、Supervisor、Handoffs 及 Custom Workflow 等多种多智能体模式&#xff0c;并提供了实用的架构选型指南…...

YOLOv8环境搭好了,然后呢?5个实用脚本带你玩转目标检测(从预测到训练)

YOLOv8环境搭好了&#xff0c;然后呢&#xff1f;5个实用脚本带你玩转目标检测&#xff08;从预测到训练&#xff09; 刚完成YOLOv8环境配置的开发者常会遇到这样的困境&#xff1a;跑通官方demo后&#xff0c;面对自己的实际需求却无从下手。本文将提供五个即用型Python脚本&a…...

Nunchaku-flux-1-dev部署避坑指南:解决403 Forbidden错误

Nunchaku-flux-1-dev部署避坑指南&#xff1a;解决403 Forbidden错误 部署Nunchaku-flux-1-dev时遇到403 Forbidden错误&#xff1f;别急&#xff0c;这篇文章手把手带你排查和解决这个常见但棘手的问题。 最近在部署Nunchaku-flux-1-dev时&#xff0c;不少小伙伴反映遇到了403…...

用了Qoder写代码飞快,联调时却总因字段不一致返工,问题出在哪?

发版前夜&#xff0c;前端字段对不上后端接口&#xff0c;联调卡了整晚。这种场景在 AI Coding 普及后并不罕见&#xff0c;不少团队用了 Qoder 觉得生成快、跑通快&#xff0c;可一旦要改需求&#xff0c;系统就僵住了。看似工具背锅&#xff0c;其实根子往往不在速度&#xf…...

Outfit字体全攻略:5大核心优势与零基础实战指南

Outfit字体全攻略&#xff1a;5大核心优势与零基础实战指南 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款专业的开源无衬线字体&#xff0c;凭借其完整的9种字重体系和现代设…...

空洞骑士模组管理终极指南:Scarab如何让复杂模组安装变得简单快速

空洞骑士模组管理终极指南&#xff1a;Scarab如何让复杂模组安装变得简单快速 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 对于《空洞骑士》玩家来说&#xff0c;模组&…...