如何通过其他类的Java回调为Main类私有DataList成员赋值
解决方案
首先明确核心逻辑:dl是Main类的私有成员,遵循Java封装规范不能直接在外部类修改,需要先在Main类中暴露操作dl的公共方法,再让回调类能拿到Main类的实例调用该方法即可。
方案1:改造回调类,构造时传入Main实例
第一步:在Main类中新增操作dl的公共方法
class Main { private DataList dl; // 新增:对外暴露操作dl的方法,可根据需求改成赋值/批量添加等逻辑 public void addDataToDl(SomeData data) { dl.add(data); } public doSomething() { Tool t = new Tool(); // 创建回调时传入当前Main实例this ToolResultCallback TRC = new ToolResultCallback(this); t.startSomething(TRC); } }
第二步:修改ToolResultCallback类,增加构造参数接收Main实例
// in separate file class ToolResultCallback extends AbstractTRC { // 存储传入的Main实例 private Main mainInstance; // 新增带参构造方法 public ToolResultCallback(Main main) { this.mainInstance = main; } @Override public void onEvent(SomeData d) { // 调用Main暴露的方法操作dl mainInstance.addDataToDl(d); } }
方案2:使用匿名内部类实现回调(无需修改原有ToolResultCallback结构)
如果不想改动ToolResultCallback的原有定义,可以直接在Main类中创建匿名回调子类,匿名内部类会默认持有外部类Main的实例,可以直接调用Main的方法:
class Main { private DataList dl; public void addDataToDl(SomeData data) { dl.add(data); } public doSomething() { Tool t = new Tool(); // 直接创建匿名回调子类 ToolResultCallback TRC = new ToolResultCallback() { @Override public void onEvent(SomeData d) { // 可直接调用Main的方法,甚至直接操作dl都可以 addDataToDl(d); } }; t.startSomething(TRC); } }
注意事项
不要为了方便直接把dl改成public修饰,会破坏类的封装性,后续很难管控成员的修改逻辑。如果你的Tool实例生命周期比Main长,建议用弱引用持有Main实例避免内存泄漏,初学者做简单功能的话可以暂时忽略这个问题。
内容的提问来源于stack exchange,提问作者user3705497
相关产品推荐
相关产品推荐

