如何通过final关键字确保类核心业务逻辑不被子类继承?
- 内容介绍
- 相关推荐
本文共计665个文字,预计阅读时间需要3分钟。
在Java中,使用`final`关键字修饰的类不能被继承。因此,如果你尝试创建一个继承自`final class PaymentService`的子类,如`class FraudPaymentService extends PaymentService`,编译器将会报错:
哪些类适合声明为 final
核心判断标准是:该类的实现是否必须保持完整、不可拆解、不可定制化。常见场景包括:
-
String、Integer等 JDK 不可变类——防止子类篡改 hash 计算或序列化行为 - 涉及密钥派生、签名验签的
SecurityUtils类——避免子类注入弱算法或跳过校验 - 支付网关封装类(如
AlipayClient),其请求构造、签名逻辑、回调验签流程必须原子执行 - 配置加载器(如
YamlConfigLoader),若允许继承,子类可能覆盖load()方法返回伪造配置
final 类中方法无需再加 final
因为类本身不可继承,所有实例方法天然无法被重写。额外给方法加 final 是冗余的,且会干扰 IDE 的重构提示(比如重命名时误判为“受保护方法”)。
本文共计665个文字,预计阅读时间需要3分钟。
在Java中,使用`final`关键字修饰的类不能被继承。因此,如果你尝试创建一个继承自`final class PaymentService`的子类,如`class FraudPaymentService extends PaymentService`,编译器将会报错:
哪些类适合声明为 final
核心判断标准是:该类的实现是否必须保持完整、不可拆解、不可定制化。常见场景包括:
-
String、Integer等 JDK 不可变类——防止子类篡改 hash 计算或序列化行为 - 涉及密钥派生、签名验签的
SecurityUtils类——避免子类注入弱算法或跳过校验 - 支付网关封装类(如
AlipayClient),其请求构造、签名逻辑、回调验签流程必须原子执行 - 配置加载器(如
YamlConfigLoader),若允许继承,子类可能覆盖load()方法返回伪造配置
final 类中方法无需再加 final
因为类本身不可继承,所有实例方法天然无法被重写。额外给方法加 final 是冗余的,且会干扰 IDE 的重构提示(比如重命名时误判为“受保护方法”)。

