构造函数调用工厂类报错:无法引用ReservationFactory非静态方法
首先,你遇到的错误Cannot make a static reference to the non-static method getReservation() from the type ReservationFactory,核心原因很简单:
你在Reservation的无参构造器里用类名直接调用ReservationFactory.getReservation(),但getReservation()是一个非静态方法——非静态方法属于类的实例,不属于类本身,必须先创建ReservaFactory的对象,才能通过对象调用这个方法。
不过先提醒你一个更严重的隐藏问题:你在Reservation的构造器里调用工厂创建Reservation实例,这会触发无限递归调用构造器,运行起来直接会栈溢出,这个逻辑得先调整。
接下来一步步修复:
步骤1:修正静态引用问题,调整构造器逻辑
把Reservation的无参构造器里的工厂调用逻辑移出去,不要在构造器里递归创建实例。如果需要通过工厂创建预订,应该在外部代码里先创建工厂实例,再调用工厂方法。
步骤2:补全类的成员变量
你的ReservaFactory里用到了this.code但没有定义这个成员变量,Reservation类里的code也没有定义,需要补上。
步骤3:确保工厂方法的逻辑合理
工厂方法getReservation()应该负责生成预订实例,我们可以让工厂自己管理预订编码的生成逻辑。
修正后的完整代码
public class Reservation { // 补全成员变量 private int code; // 构造器只负责初始化自身属性,不要递归调用工厂 public Reservation(int code) { this.code = code; } // 可选:添加getter方法 public int getCode() { return code; } } class ReservaFactory { // 补全编码成员变量,这里可以加个自增逻辑来生成唯一编码 private int currentCode = 1; // 非静态方法,需要通过工厂实例调用 public Reservation getReservation() { // 生成新编码并自增 Reservation r = new Reservation(currentCode); currentCode++; return r; } }
如何正确使用工厂创建实例
在你的业务代码里,应该这样调用:
// 先创建工厂实例 ReservaFactory factory = new ReservaFactory(); // 通过工厂实例调用非静态方法创建预订 Reservation myReservation = factory.getReservation();
额外优化(可选)
如果你想让工厂成为单例,或者想用静态方法调用,可以把getReservation()改成静态方法,同时把currentCode也改成静态变量:
class ReservaFactory { private static int currentCode = 1; public static Reservation getReservation() { Reservation r = new Reservation(currentCode); currentCode++; return r; } } // 调用方式(直接用类名) Reservation myReservation = ReservaFactory.getReservation();
这样就彻底解决了静态引用的问题,同时也修复了递归构造和成员变量缺失的bug。
内容的提问来源于stack exchange,提问作者Peter Martins

