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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:35