You need to enable JavaScript to run this app. Java子类同步父类属性实现方法及SingleSet数组null问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 18:06:04