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

Java产品建模中易腐产品接口的过期日期存储及实例变量作用域问题咨询

Java产品建模中易腐产品接口的过期日期存储及实例变量作用域问题咨询

没事的,英语不是母语完全没关系,咱们专注解决问题就好😉

先直接给你明确结论:你没法在setExpDate方法里定义一个变量,让它成为实例变量持久存在——方法里声明的是局部变量,方法执行结束后就会被垃圾回收,根本没法保存下来供后续使用。所以这个思路走不通,咱们来看看更合理的方案:

方案一:让需要过期日期的子类实现接口,并单独维护实例变量

这是最符合面向对象设计原则的做法,核心思路是:只有易腐产品才需要持有过期日期属性,所以把这个变量放在实现Perishable接口的子类里,而不是污染基类Product。

代码示例如下:

import java.time.LocalDate;

// 基础产品类,只包含所有产品共有的属性和方法
public class Product {
    private String productId;
    private String name;
    private double price;

    // 构造器、getter、setter等通用方法
    public Product(String productId, String name, double price) {
        this.productId = productId;
        this.name = name;
        this.price = price;
    }

    // 省略getter和setter
}

// 易腐产品行为接口,定义必要的操作
public interface Perishable {
    void setExpDate(LocalDate expDate);
    LocalDate getExpDate();
}

// 具体的易腐产品类,继承Product同时实现Perishable接口
public class PerishableProduct extends Product implements Perishable {
    // 这里单独维护过期日期变量,只有该类的实例会持有它
    private LocalDate expDate;

    public PerishableProduct(String productId, String name, double price) {
        super(productId, name, price);
    }

    @Override
    public void setExpDate(LocalDate expDate) {
        this.expDate = expDate;
    }

    @Override
    public LocalDate getExpDate() {
        return expDate;
    }
}

这样做的好处:

  • 遵循单一职责原则,Product只负责通用产品逻辑,易腐相关的属性和行为由子类承担
  • 避免多重继承问题,接口只定义行为,不携带属性,完美适配你的需求
  • 代码结构清晰,后续新增其他易腐产品(比如牛奶、面包),直接继承Product并实现Perishable即可

方案二:用组合模式增强扩展性(可选)

如果之后你需要给易腐产品添加更多相关属性(比如保质期时长、储存条件),可以把过期相关的逻辑封装成一个单独的类,通过组合的方式让易腐产品持有它,这样扩展性更强:

import java.time.LocalDate;

public class ExpirationDetails {
    private LocalDate expDate;
    private int shelfLifeDays; // 新增保质期时长属性

    // 构造器、getter、setter
    public ExpirationDetails(LocalDate expDate, int shelfLifeDays) {
        this.expDate = expDate;
        this.shelfLifeDays = shelfLifeDays;
    }

    // 省略getter和setter
}

public interface Perishable {
    void setExpirationDetails(ExpirationDetails details);
    ExpirationDetails getExpirationDetails();
}

public class Milk extends Product implements Perishable {
    private ExpirationDetails expirationDetails;

    public Milk(String productId, String name, double price) {
        super(productId, name, price);
    }

    @Override
    public void setExpirationDetails(ExpirationDetails details) {
        this.expirationDetails = details;
    }

    @Override
    public ExpirationDetails getExpirationDetails() {
        return expirationDetails;
    }
}

关于你提到的“在Product里加expDate按需初始化”的方案

虽然技术上可行,但非常不推荐——这会让Product类变得臃肿,承担了不属于它的职责(不是所有产品都需要过期日期),后续产品类型越多,基类的维护成本越高,完全违背了面向对象的设计思想。

总结下来,优先选择方案一,既简单又符合设计原则,完全能满足你的需求。

备注:内容来源于stack exchange,提问作者adrian quispe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:08:13