0

0

如何实现Java的封装性_getter/setter方法与访问权限控制

P粉602998670

P粉602998670

发布时间:2026-03-08 09:49:03

|

324人浏览过

|

来源于php中文网

原创

public字段比private+getter/setter更危险,因其直接暴露导致无法校验(如age=-5),而setter可加约束;封装核心是控制访问而非凑数,应按需提供getter/setter,避免@data滥用破坏边界。

如何实现java的封装性_getter/setter方法与访问权限控制

为什么 public 字段比 private + getter/setter 更危险

因为直接暴露字段会让调用方绕过所有校验逻辑和内部约束。比如 age 字段设为 public int age,外部代码就能写 user.age = -5user.age = 200,而你完全无法拦截。

private 配合 getAge()/setAge(int age),才能在 setAge 里加判断:

public void setAge(int age) {
    if (age < 0 || age > 150) {
        throw new IllegalArgumentException("年龄必须在 0~150 之间");
    }
    this.age = age;
}
  • 哪怕现在没校验需求,也建议默认用 private + 方法——后期加逻辑不破坏 API
  • final 字段如果真不需要修改,就别写 setter;写了却空实现或直接抛异常,反而误导调用方
  • IDE 自动生成的 getter/setter(如 IntelliJ 的 Alt+Insert)默认不带校验,别直接交出去

getter/setter 不是“必须成对出现”的铁律

封装的核心是控制访问,不是凑数。只读字段就只写 getXxx(),禁止修改就压根不写 setXxx()

常见误用:

立即学习Java免费学习笔记(深入)”;

Clipfly
Clipfly

一站式AI视频生成和编辑平台,提供多种AI视频处理、AI图像处理工具。

下载
  • id 字段配 setId(),但数据库主键本就不该被外部改
  • 给计算属性(如 getFullName())配 setFullName(),结果内部拆分逻辑混乱
  • 为布尔字段生成 isXxx()setXxx() 没问题,但别把 isRunning() 改成 getRunning() —— 这违反 JavaBeans 规范,部分框架(如 Jackson、Spring Data)会识别失败

lombok @Data 会悄悄破坏封装边界

@Data 看似省事,但它无差别生成所有字段的 getter/setter,包括你不希望暴露的内部状态字段(如 retryCountcacheKey)。

更隐蔽的问题:

  • 生成的 toString() 可能打印敏感信息(如密码哈希、token)
  • equals()/hashCode() 默认包含所有字段,若某个字段是临时缓存值,会导致比较失真
  • 如果某字段需要特殊序列化(如 @JsonIgnore),@Data 生成的 getter 仍会被 Jackson 调用,得额外加注解压制

建议:用 @Getter + @Setter 显式标注需要暴露的字段,而不是一揽子 @Data

访问权限不是越严越好,而是按协作层级设防

private 是底线,但 protected 和包级(default)权限常被忽略其实际用途。

  • 子类需要扩展行为?用 protected 暴露核心字段或方法,比 public 更安全(仅限继承树内可见)
  • 同包内工具类需复用逻辑?包级权限比 public 更精确——不对外暴露,又避免重复实现
  • 别为了“看起来封装好”把一切塞进 private,结果导致测试时只能靠反射或加 @TestOnly 方法,反而增加维护成本

真正难的是判断“谁该信任”,而不是机械套用权限关键词。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

154

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6560

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

840

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1090

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1902

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

605

2024.08.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 78.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号