Java子类同步父类属性实现方法及SingleSet数组null问题排查
问题根源
你遇到game数组全为null的核心原因,是数组的值复制动作发生在了父类盘数属性赋值之前,存了过期的null快照:
- 完整执行流程是:创建
SingleSet实例 → 进入子类构造方法 → 走完super()初始化父类 → 初始化长度为3的game数组,立刻调用super.getSet1()/getSet2()/getSet3()把当时父类的属性值(此时还都是Java默认初始化的null)存进数组。 - 构造方法执行完成后,你才依次调用
game1.setSet1/setSet2/setSet3()把输入框的内容赋值给父类的三个盘数属性。这个过程和之前存进game数组的null值没有任何联动,数组里存的还是当初构造时抓的null快照,自然不会跟着父类属性更新。
另外你写的父类无参构造public Set() { setSet1(set1); setSet2(set2); setSet3(set3); }属于冗余逻辑:这里传给setter的set1/set2/set3本身就是null,等于自己给自己赋null值,没有实际作用,Java对象初始化时实例属性默认就会被设为null。
可落地的同步实现方案
要实现父类盘数属性和子类game数组的同步,核心是不要在构造方法里提前拍静态快照,要让数组的取值和父类属性的更新动作绑定,下面两种方案都可以直接用:
方案1:去掉独立数组存储,实时拼装返回值
这是维护成本最低、完全不会出现数据不同步的方式,相当于把game数组做成父类属性的实时视图,不存独立副本:
- 删除
SingleSet里的private String[] game;字段,以及对应的无类型校验的setGame方法 - 重写
getGame()方法,每次调用时实时从父类读取最新盘数值拼装成数组返回:@Override public String[] getGame() { // 每次调用都读父类最新的属性值,不存在快照过期问题 return new String[]{super.getSet1(), super.getSet2(), super.getSet3()}; } - 修改
toString()方法的读取逻辑,调用getGame()获取最新值,不要直接读原来的数组字段:@Override public String toString(){ String[] currentGame = getGame(); return String.format("Player: %s Vs. Player: %s, Single set game: %s, %s, %s", homePlayer, awayPlayer, currentGame[0], currentGame[1], currentGame[2]); }
这种方式下,只要父类的盘数属性被更新,不管什么时候拿game数组、打印实例,拿到的都是最新值,完全不会出现不同步的问题。
方案2:保留独立数组,在属性更新时同步刷新
如果你确实需要保留game数组的独立引用,可以通过重写父类的setter方法,在每次更新父类盘数属性时,同步刷新数组对应位置的值:
- 保留子类里的game数组字段,修改子类构造方法,只初始化数组长度,不要提前读取父类属性赋值:
public SingleSet(Object homePlayer, Object awayPlayer){ super(); game = new String[3]; // 仅初始化数组长度,不提前抓值 setHomePlayer(homePlayer); setAwayPlayer(awayPlayer); } - 重写三个父类的setSet方法,每次给父类属性赋值后,同步更新game数组的对应位置:
@Override public void setSet1(String set1) { super.setSet1(set1); game[0] = set1; // 父类属性更新后,同步刷新数组 } @Override public void setSet2(String set2) { super.setSet2(set2); game[1] = set2; } @Override public void setSet3(String set3) { super.setSet3(set3); game[2] = set3; }
这种方式下,不管什么时候调用setSetX()方法,都会同时更新父类属性和对应的数组值,不会出现数据不一致的问题。
额外优化建议
- 删掉父类无参构造里冗余的自赋值代码,避免无意义的方法调用。
- 球员字段不建议用
Object类型存储,可以定义专门的Player类承载球员信息,减少后续类型转换的报错概率。
内容的提问来源于stack exchange,提问作者Codekid
相关产品推荐
相关产品推荐

