为新创建对象实现标识符生成器,现有代码存在哪些缺失?
代码中的问题与遗漏点
标识符初始化时机错误:当前
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
相关产品推荐
相关产品推荐

