Java中如何在其他类私有复用公有类成员且无需知晓所有成员?
复用公有类成员的可行方案
针对你提出的需求——无需手动同步公有类成员,在另一个类中以私有(可加final)形式复用其所有成员,以下是两种Java环境下的可行方案:
一、组合模式(推荐)
这是最符合Java设计原则的方案,通过持有公有类的实例来复用成员,从根源避免手动同步的麻烦。
public class SomeOtherFile { // 私有final的实例,完全复用SetOfThings的所有成员 private final SetOfThings things = new SetOfThings(); // 内部直接通过实例访问原类成员,无需关心原类变更 public void processThings() { System.out.println(things.someNumber); System.out.println(things.someString); things.example.calibrate(); } // 若需对外暴露部分功能,可添加封装方法(可选) public int getSomeNumber() { return things.someNumber; } }
优势
- 零维护成本:SetOfThings新增/删除成员时,无需修改SomeOtherFile,直接通过
things.xxx访问即可 - 编译期安全:IDE会自动提示成员名称,避免拼写错误
- 性能无损耗:完全是常规的对象访问操作
局限性
- 复用的是原实例的成员,而非独立副本;如果需要完全独立的字段值,这个方案不适用
二、反射+容器存储(动态同步)
如果必须在SomeOtherFile中存储独立的私有成员值,可通过反射动态扫描公有类的成员,将值存入私有容器中。
import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class SomeOtherFile { // 私有容器,存储SetOfThings的所有公有成员值 private final Map<String, Object> thingsMembers = new HashMap<>(); public SomeOtherFile() { try { SetOfThings source = new SetOfThings(); // 获取SetOfThings的所有公有字段 Field[] sourceFields = SetOfThings.class.getFields(); for (Field field : sourceFields) { // 将原字段值存入私有容器 thingsMembers.put(field.getName(), field.get(source)); } } catch (Exception e) { e.printStackTrace(); } } // 内部访问示例 public void useThings() { int num = (int) thingsMembers.get("someNumber"); String str = (String) thingsMembers.get("someString"); Joystick joystick = (Joystick) thingsMembers.get("example"); // 执行业务逻辑 } }
优势
- 无需提前知晓SetOfThings的具体成员,原类变更时自动同步值
- 所有值对外完全隐藏,符合私有访问要求
局限性
- 编译期无类型校验,访问时需强制类型转换,容易引发
ClassCastException - 反射存在性能开销,不适合高频调用场景
- 无法像访问普通字段那样直接调用,需通过Map的
get方法操作
补充说明
如果一定要在SomeOtherFile中生成真正的私有字段(而非容器存储),Java原生不支持自动同步,需借助代码生成工具(如APT注解处理器、Lombok自定义插件)在编译期自动生成对应字段。但这种方式需要额外配置工具链,复杂度较高,一般不推荐。
内容的提问来源于stack exchange,提问作者AGreatUsernameChoice
相关产品推荐
相关产品推荐

