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

为新创建对象实现标识符生成器,现有代码存在哪些缺失?

代码中的问题与遗漏点
  • 标识符初始化时机错误:当前getNumber()方法每次被调用时都会执行number = ++Figure.counter,这会导致同一个对象的编号被多次修改,完全违背了“创建对象时分配唯一标识符”的需求。正确逻辑应该是在对象构造阶段就完成编号赋值,而非在getter方法中动态修改。

  • 父类构造函数未处理编号初始化:Figure的空构造函数没有给number赋值,导致子类对象创建时,编号不会被自动分配。需要在父类构造函数中完成编号的初始化:

    public Figure() {
        this.number = ++counter;
    }
    
  • getNumber()方法逻辑错误:该方法不应包含赋值操作,仅需返回已初始化的number值,修正后:

    public int getNumber() {
        return number;
    }
    
  • setCounter()方法权限过高:公开的setCounter()允许外部随意修改计数器值,会彻底破坏编号的唯一性和连续性,应将其设置为private或protected,禁止外部篡改:

    private static void setCounter(int counter) {
        Figure.counter = counter;
    }
    
  • 需确保子类构造触发父类逻辑:虽然createSquare()方法返回new Square(a),但要保证Square类的构造函数(无论显式还是隐式)调用了父类构造super(),这样才能触发父类中的编号赋值逻辑,确保每个子类对象都能获得唯一编号。

修正后的核心代码示例:

public abstract class Figure {

    private static int counter = 0;

    private int number;
   
    // 构造阶段完成编号初始化
    public Figure() {
        this.number = ++counter;
    }

    public static Square createSquare(double a) {
        return new Square(a);
    }
 
    public static int getCounter() {
        return counter;
    }

    // 限制计数器修改权限
    private static void setCounter(int counter) {
        Figure.counter = counter;
    }

    // 仅返回已初始化的编号
    public int getNumber() {
        return number;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:27:18