0

0

如何防止类被继承_使用final类确保架构安全性

P粉602998670

P粉602998670

发布时间:2026-02-20 14:57:10

|

252人浏览过

|

来源于php中文网

原创

java中声明final类唯一方式是在class前加final,编译期禁止继承,报错“cannot inherit from final class”;它防误用不防黑客,不保证不可变性,与sealed互斥,影响mock和aop代理。

如何防止类被继承_使用final类确保架构安全性

Java 里怎么声明一个 final 类

直接在 class 关键字前加 final,这是唯一方式。编译器会立刻阻止任何子类继承它,不是运行时检查,是编译期硬限制。

常见错误现象:javac 报错 cannot inherit from final class,说明你试图 extends 了一个 final 类——这不是 bug,是设计生效了。

  • final 类不能被 extends,但可以被 new、可以有静态方法、可以实现接口
  • 类本身 final 不影响其字段或方法是否 final;反过来,字段或方法 final 也不让类自动变成 final
  • 如果类已经用了 private 构造器 + 静态工厂(比如 java.util.Collections 里的不可变集合),再加 final 是冗余的;但加了更明确,推荐加

为什么不让继承?真能防住所有“绕过”吗

核心目的不是防黑客,而是防误用:避免下游开发者无意中覆写关键逻辑、破坏封装契约,比如 java.lang.Stringjava.time.LocalDate 这类值对象必须保证不可变性。

容易踩的坑:

Cognitive Mill
Cognitive Mill

一个云计算平台,可以分析视频并自动生成预告片

下载
  • 以为 final 能防止反射创建子类——不能。反射无法绕过 final class 的继承限制,但能调用私有构造器(如果存在)、修改 final 字段(需 setAccessible(true)),所以 final class 不等于“绝对安全”,只是守住最常见继承路径
  • sealed 混用会冲突。Java 17+ 的 sealed 类明确列出允许继承的子类,和 final 语义互斥;一个类不能同时是 finalsealed
  • 泛型类型擦除后,List<string></string>List<integer></integer> 运行时都是 List,但 final 类不影响泛型使用,该用照用

哪些场景下不该用 final 类

不是所有工具类或工具对象都适合标 final。滥用反而降低可测试性和可扩展性。

典型反例:

  • 需要被 Mockito 等框架 mock 的类:默认情况下,final 类无法被 mock(除非启用 mock-maker-inline,但这带来额外开销和兼容风险)
  • 框架回调入口类(如 Spring 的 @Controller@Service 组件),如果标记 final,某些 AOP 代理(JDK 动态代理除外)可能失败,因为 CGLIB 需要生成子类
  • 内部抽象基类的实现类,如果未来可能提取公共行为到父类,提前 final 会锁死演进路径

final 类和不可变对象的关系

final 类 ≠ 不可变对象。前者管继承,后者管状态变化。两者常一起出现,但独立判断。

实操建议:

  • 要实现不可变对象,除了类声明 final,还要确保:所有字段 private final、不提供修改方法、防御性拷贝可变参数(如 ArrayList)、不泄漏可变内部引用
  • 如果字段是 final 但指向可变对象(比如 final List<string> data</string>),外部仍可通过 data.add() 改变内容——final 只锁引用,不锁对象状态
  • LocalDateTime 这种既 final 又不可变的类,才是理想范本;而 StringBuilderfinal 类,但可变——说明 final 类完全可以有 append() 这种改变自身状态的方法
事情说清了就结束。最常被忽略的一点是:final 类的约束力只存在于编译期继承链上,对序列化、反射、字节码增强这些层面,它几乎不设防。要不要用,得看你的威胁模型到底防谁。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

143

2025.08.06

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

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

81

2026.01.26

string转int
string转int

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

790

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1536

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

423

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2261

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

37

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

666

2024.01.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

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

精品课程

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

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