【发布时间】:2017-11-11 11:37:08
【问题描述】:
案例:
通常产品对象具有以下属性:
- 姓名
- 价格
但在促销周期间,虽然大部分产品仍然只有名称和价格作为属性,但部分选定的产品会获得附加属性:
- 颜色
但是在促销周之后,这些之前促销的产品将失去颜色属性,再次成为标准产品。
当前实施:
我有 2 个课程 -> Product 和 ProductPromotion
public class Product {
private String name;
private BigDecimal price;
private ProductPromotion promotion;
public Product(String name, BigDecimal price) {
this.name = name;
this.price = price;
}
public void setProductPromotion(ProductPromotion promotion) {
this.promotion = promotion;
}
}
public class ProductPromotion {
private Color color;
public ProductPromotion (Color color) {
this.color = color;
}
}
如您所见,Product 单方面引用了 ProductPromotion。默认产品对象对其 ProductPromotion 有一个空引用,而带有促销的产品,我只是这样做:myproduct.setProductPromotion(new ProductPromotion(Color.RED));
每当我决定我的产品的促销活动结束时,我都会这样做:
myproduct.setProductPromotion(null);
我的问题:
我真的不喜欢对每个非促销产品都有一个对 ProductPromotion 的空引用,因为这种建模并不是很漂亮。我的意思是,如果占位符不包含任何内容(至少对于非促销产品),为什么我们需要保留一个占位符。所以我想请有经验的程序员更好地实现这个功能。
进一步思考:
根据您的意见和想法,我能够提出一种新方法,我非常欢迎您对此提出想法:
我会将 ProductPromotion 类拆分为默认版本和提升版本:
public class ProductPromotion {
private boolean promotionDisabled;
public ProductPromotion() {
setPromotionDisabled(true);
}
public boolean isPromotionDisabled () {
return promotionDisabled;
}
public boolean setPromotionDisabled (boolean value) {
promotionDisabled = value;
}
}
public class ProductPromotionEnabled extends ProductPromotion {
private Color color;
public ProductPromotion (Color color) {
super(false);
this.color = color;
}
public Color getColor () {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
所以我会创建一个类型为 ProductPromotion 的 defaultPromotionObject,它引用了任何非提升对象。而促销对象将指向 ProductPromotionEnabled 类型的promotionEnabledObject。您对此有何看法?
【问题讨论】:
-
只需添加
color属性,无论您是否立即不需要它。您可以说颜色为 null 或值为零表示完全没有颜色。 -
@C0dekid 您好,我刚刚添加了我当前的代码实现。
-
@Enzokie 是的,我就是这么做的。但是有没有更好的解决方案不需要有一个恒定的颜色占位符,因为颜色空引用并不合乎逻辑(如果产品没有颜色,为什么我仍然需要明确告诉大家它没有有颜色)?
-
Since color null reference are not really logical我不同意,null是一个标志,表示产品没有颜色。完全没有颜色属性表示产品直到永远都不会有颜色。毕竟这是 Java。 -
是的,它是 Java。我认为可能有更好的方法来模拟 Product 和 ProductPromotion 之间的关系,其中我不需要对任何默认 Product 对象使用空引用。
标签: java oop data-modeling