如何为Item子类生成符合规则的9位唯一ID编号?
解决方案:正确实现Item的唯一ID生成逻辑
你的代码问题出在局部变量无法保留自增状态,以及没有遵循「全局后8位自增」的规则。下面是修正后的实现思路和代码:
核心问题分析
- 你在
Item构造方法里定义的commercialID、industrialID是局部变量,每次创建对象都会重新初始化,根本无法实现自增。 - 需求要求所有
Item共享一个后8位的自增序列(不管类型),比如第一个商业航班后8位是0,下一个人员的后8位就是1,所以需要一个全局的静态计数器。 - 使用
instanceof判断类型不够优雅,且扩展性差(新增类型时要修改Item的构造方法)。
修正后的代码实现
1. 抽象父类Item
定义静态全局计数器,同时让子类实现抽象方法返回对应类型的前缀:
public abstract class Item { protected int id; // 全局静态计数器,记录后8位的自增值,初始为0 private static int globalCounter = 0; public Item() { // 由子类提供前缀,加上全局计数器生成ID this.id = getPrefix() + globalCounter; // 每创建一个Item,计数器自增1 globalCounter++; } // 抽象方法,子类必须实现,返回对应类型的前缀(100000000、200000000等) protected abstract int getPrefix(); // 可选:提供获取ID的方法 public int getId() { return id; } }
2. 中间类Flight(继承自Item)
因为Commercial和Industrial都继承自Flight,可以在这里统一处理航班类的前缀逻辑,或者让子类各自实现:
public abstract class Flight extends Item { // 航班类的前缀统一处理,或者让子类自己实现getPrefix }
3. 商业航班类Commercial
实现getPrefix方法返回1开头的前缀:
public class Commercial extends Flight { @Override protected int getPrefix() { return 100000000; } }
4. 工业航班类Industrial
实现getPrefix方法返回2开头的前缀:
public class Industrial extends Flight { @Override protected int getPrefix() { return 200000000; } }
5. 人员类Person和货物类Cargo示例
public class Person extends Item { @Override protected int getPrefix() { return 300000000; } } public class Cargo extends Item { @Override protected int getPrefix() { return 400000000; } }
测试验证
运行以下代码:
public class Test { public static void main(String[] args) { Item commercial1 = new Commercial(); System.out.println(commercial1.getId()); // 输出100000000 Item person1 = new Person(); System.out.println(person1.getId()); // 输出300000001 Item industrial1 = new Industrial(); System.out.println(industrial1.getId()); // 输出200000002 Item cargo1 = new Cargo(); System.out.println(cargo1.getId()); // 输出400000003 } }
完全符合需求中的ID生成规则。
补充说明
- 使用静态全局计数器保证所有
Item的后8位是连续自增的。 - 通过**抽象方法
getPrefix()**让子类提供对应类型的前缀,避免在父类中硬编码类型判断,扩展性更强(新增类型时只需添加新子类并实现getPrefix)。 - 如果需要持久化计数器(比如程序重启后继续自增),可以把计数器的值存储到文件或数据库中,初始化时读取。
内容的提问来源于stack exchange,提问作者Seyi Asoga
相关产品推荐
相关产品推荐

