抽象类通过protected构造方法统一初始化公共属性,关键字段设为final并校验参数,可选默认值用声明初始化,通用逻辑用构造代码块,避免在构造期调用抽象方法。

抽象类不能直接 new,但它的构造方法会在子类实例化时自动执行——这是统一初始化公共属性最可靠的方式。
用 protected 构造方法接收必要参数
抽象类的构造方法通常设为 protected,既允许子类调用,又防止被外部误用。所有子类共有的、不可缺失的属性,应通过构造参数传入,并在构造器中完成赋值和校验:
- 关键字段声明为 final,确保一旦初始化就不能被子类绕过或修改
- 在构造器里做非空、范围等基础校验,避免子类传入非法值
- 不依赖子类状态的默认值(如状态枚举、重试次数)可在此设好
结合声明初始化补全可选默认值
不是所有属性都需要构造参数强制传入。对有合理默认含义的字段,可在声明时直接初始化,更简洁安全:
- 例如:
protected OrderStatus status = OrderStatus.CREATED; - 集合类字段也可用声明初始化:
protected final List<string> tags = new ArrayList();</string> - 这种写法比放在构造器里更轻量,且不受构造器调用顺序影响
用构造代码块处理无参通用逻辑
有些初始化动作不依赖任何参数,比如日志器创建、标志位设置、基础监控注册,适合用实例初始化块(即构造代码块):
- 写法是用
{ ... }包裹的代码段,会插在每个构造器开头执行 - 不管子类调用哪个重载构造器,这些逻辑都自动触发,无需重复写
- 例如:
{ logger = LoggerFactory.getLogger(getClass()); isActive = true; }
避开构造期调用抽象方法这个坑
抽象类构造器或代码块里绝对不要调用 abstract 方法:
- 此时子类对象尚未构建完成,字段可能还是默认值(null / 0)
- 若需子类参与初始化,应改为定义 protected init() 方法,由子类在 super() 后显式调用
- 或者把定制逻辑后移到业务方法(如
load()、start())中执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











