
本文介绍一种通过组合(composition)模式,在不暴露内部细节的前提下,安全复用另一个类中动态变化的公共成员的方法,避免硬编码字段声明和重复维护。
在 Java 开发中,当多个类需要共享同一组配置或状态数据(如 someNumber、someString、example 等),而这些字段又可能随业务演进频繁增删改时,直接在每个使用方类中手动声明相同字段不仅冗余,更严重违背了 DRY(Don’t Repeat Yourself)原则与封装思想。你无法也不应要求 SomeOtherFile “预知” SetOfThings 的全部字段结构——这会将耦合固化在源码层面,丧失灵活性。
✅ 正确解法是采用对象组合 + 封装引用:
SomeOtherFile 不复制字段,而是持有一个私有(且可选 final)的 SetOfThings 实例引用。所有对原始数据的访问均通过该引用间接完成,既保证了数据一致性,又实现了逻辑隔离。
以下是推荐实现:
// SetOfThings.java —— 数据载体(建议后续改为 package-private 或添加 getter)
public class SetOfThings {
public int someNumber = 1;
public String someString = "Java is kinda challenging sometimes...";
public Joystick example = new Joystick(someNumber); // 注意:String 首字母大写,已修正
}// SomeOtherFile.java —— 使用方(完全隐藏 SetOfThings 的内部结构)
public class SomeOtherFile {
private final SetOfThings things; // final 保证引用不可变,增强安全性
// 构造器注入,强制依赖明确化
public SomeOtherFile(SetOfThings things) {
this.things = Objects.requireNonNull(things, "SetOfThings cannot be null");
}
// 对外提供受控访问(示例方法)
public void logConfig() {
System.out.println("Number: " + things.someNumber);
System.out.println("Message: " + things.someString);
// things.example 可按需调用,但调用方无需知晓其存在
}
}? 关键优势说明:
立即学习“Java免费学习笔记(深入)”;
- ✅ 零字段同步成本:SetOfThings 新增/删除字段时,SomeOtherFile 无需任何修改;
- ✅ 访问控制灵活:可通过封装 things 引用 + 提供有限 public 方法,避免暴露不必要细节;
- ✅ 支持运行时动态绑定:可传入不同配置实例(如测试用 Mock 对象),利于单元测试;
- ⚠️ 注意事项:若 SetOfThings 字段为 public,则仍存在被意外修改风险。强烈建议后续重构为 private 字段 + public final getter 方法,真正实现“只读视图”。
? 进阶提示:如需彻底禁止外部修改,可将 SetOfThings 设计为不可变类(Immutable Class)——所有字段 private final,构造器初始化,不提供 setter,并确保其引用类型(如 Joystick)也具备不可变性或防御性拷贝。
这种设计符合面向对象的高内聚、低耦合准则,是管理跨模块共享配置的标准实践。










