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
相关产品推荐
相关产品推荐

