Java中修改类实例属性时如何让关联的其他类实例属性同步更新
你的问题本质是值拷贝和引用存储的差异:你当前在Info_C类中单独声明了name、company两个属性,构造方法执行时只是把传入的Info实例的对应属性的值复制到了Info_C的自有属性里,相当于存了一份属性快照,后续原Info实例的属性修改不会影响这份已经拷贝好的值,自然不会同步。
修复方案
直接修改Info_C的存储逻辑,不单独拷贝name、company属性,而是直接存储关联的Info对象的引用,每次需要取人员基础信息时直接从关联的Info实例中读取即可,无需额外维护副本。
第一步:给Info类添加属性Getter方法
方便外部类读取Info的属性,也符合Java封装规范:
public class Info { String name; String company; Info(String n, String c) { name = n; company = c; } public void setName(String name) { this.name = name; } public void setCompany(String company) { this.company = company; } // 新增Getter方法 public String getName() { return name; } public String getCompany() { return company; } public String toString() { return this.name + ". working at " + this.company; } }
第二步:修改Info_C类的结构
删除冗余的name、company属性,改为存储Info引用:
public class Info_C { String position; String dept; // 直接存储关联的Info对象引用,替代冗余的属性拷贝 private Info info; Info_C(Info i, String p, String d) { this.info = i; position = p; dept = d; } public void setInfo(Info i) { this.info = i; } public void setPosition(String p) { this.position = p; } public String toString() { // 直接从关联的Info实例读取最新的属性值 return this.info.getName() + ". Working as a " +this.position + " in " + this.info.getCompany() + "'s " + this.dept; } // main方法不需要修改 public static void main(String[] args) { var Pf_B = new Info("Bob","Apple"); var Pf_J = new Info("James","Google"); var TM = new Info_C(Pf_B, "Team Manager","Sales Team1"); var AM = new Info_C(Pf_B, "Assistane Manager","HR Team"); var RE = new Info_C(Pf_B, "Research Engineer","R&D Team"); System.out.println(Pf_B); // Bob. working at Apple System.out.println(Pf_J); // James. working at Google System.out.println(TM); // Bob. Working as a Team Manager in Apple's Sales Team1 System.out.println(AM); // Bob. Working as a Assistane Manager in Apple's HR Team System.out.println(RE); // Bob. Working as a Research Engineer in Apple's R&D Team Pf_B.setName("Eric"); Pf_B.setCompany("Samsung"); AM.setPosition("Team Manager"); RE.setInfo(Pf_J); System.out.println("=========================Changed=========================="); System.out.println(Pf_B); // Eric. working at Samsung System.out.println(TM); // 输出变为 Eric. Working as a Team Manager in Samsung's Sales Team1 System.out.println(AM); // 输出变为 Eric. Working as a Team Manager in Samsung's HR Team System.out.println(RE); // James. Working as a Research Engineer in Google's R&D Team } }
修改完成后运行代码,所有关联同一个Info实例的Info_C实例都会自动读取到最新的属性值,实现自动同步。
另外你的问题标题可以修改为《Java中修改基础信息实例属性后,关联的扩展信息实例属性如何自动同步》,更贴合问题场景。
内容的提问来源于stack exchange,提问作者love Croquembouch
相关产品推荐
相关产品推荐

