通常,产品对象具有以下属性:
但是在促销周期间,虽然大多数产品仍然只有名称和价格作为属性,某些所选产品会获得额外的属性:
但是在推广周之后,这些先前推出的产品将失去其颜色属性并再次成为标准产品。
我有2个类 - >产品和产品推广
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的促销活动结束时,我就会:
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 的promoteEnabledObject。你对这个有什么看法?
答案 0 :(得分:2)
类定义实体的属性和行为。 当我们进行私人" ProductPromotion促销"在类中的属性,这意味着所有产品都应该有促销,并且为了表明特定产品没有促销,我们在那里放置了空。
不应该这样。 实现这一目标的更好方法是删除"私人ProductPromotion促销" Product类和ProductPromotion类的属性应重命名为PromotedProduct。 PromotedProduct应该继承自Product,因此它将是具有促销的特定类型的产品。
通过这种方式,我们将有两个班级。 Product和PromotedProduct(特定类型的产品)然后我们可以使用多态来对产品列表进行操作。
代码:
public class Product {
private String name;
private BigDecimal price;
public Product(String name, BigDecimal price) {
this.name = name;
this.price = price;
}
}
public class PromotedProduct extends Product {
private Color color;
public PromotedProduct(String name, BigDecimal price ,Color color) {
super(name ,price);
this.color = color;
}
}
Product product[3];
product[0] = new Product("keyboard",100);
product[1] = new PromotedProduct("stick", 80 ,Color.RED);
等等。
答案 1 :(得分:1)
使用班级Optional
。这消除了null
值,实际上你似乎想要这样的关系。
private Optional<ProductPromotion> promotion = Optional.empty();
promotion.ifPresent(promo -> promo...);
另一种方法是将产品映射到促销活动。