You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Singer类static ID配置错误 新增记录后所有原有ID变为最新值如何解决

问题根本原因

你代码里的id字段被static关键字修饰,静态变量属于类本身,是该类所有实例共享的全局变量,全类只会存储一份值。你每次新创建Singer实例时执行id++,相当于修改的是全局唯一的这个id值,所有Singer实例调用getId()返回的都是这个最新值,自然会出现旧记录ID全部变成最新新增ID的问题。

修复方案

你需要拆分出两个不同作用的变量:

  • 静态的idCounter:作为类全局的自增计数器,仅负责记录下一个要分配的ID序号,所有实例共享
  • 普通成员变量id:属于每个Singer实例独有的ID属性,创建实例时从计数器取值,不和其他实例共享

修改后的代码如下:

public class Singer{
    // 静态计数器,仅负责自增计数,全类共享
    private static int idCounter = 0;
    // 实例独有ID,每个实例单独存储
    private int id;
    public String name;
    public String country;
    public String musicCategory;
    public String bio;

    public Singer(){
        this(null,null,null,null);
    }

    public Singer(String name, String country, String musicCategory, String bio){
        this.name=name;
        this.country=country;
        this.musicCategory=musicCategory;
        this.bio=bio;
        // 每次创建实例,取当前计数器值作为当前实例的ID,再把计数器+1
        this.id = idCounter;
        idCounter++;
    }
    //getter
    public int getId(){
        return id;
    }

    public String getName(){
        return name;
    }

    public String getCountry(){
        return country;
    }

    public String getMusicCategory(){
        return musicCategory;
    }

    public String getBio(){
        return bio;
    }

    //setter
    public void setId(int id){
        this.id = id;
    }

    public void setName(String name){
        this.name=name;
    }

    public void setCountry(String country){
        this.country=country;
    }

    public void setMusicCategory(String musicCategory){
        this.musicCategory=musicCategory;
    }

    public void setBio(String bio){
        this.bio=bio;
    }
}

如果是多线程环境下批量创建实例,可以把idCounter替换为AtomicInteger类型避免线程安全问题,单线程场景下上述代码即可正常运行。

内容的提问来源于stack exchange,提问作者fallenhamster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:48:00