使用一个小例子,其层次结构为:
在BaseModel内部我想在任何扩展它的类中有一个对象Faker
,这里的正确方法是什么?
private Faker faker = new Faker();
protected Faker getFaker() {
return this.faker;
}
protected Faker faker = new Faker();
我选择了这个:
public class Order extends BaseModel {
private static final Logger LOG = LogManager.getLogger(Order.class);
private String orderName;
private String orderAddress;
private String orderEmail;
private String orderPaymentType;
public Order(String order_paymentType) {
this.orderName = getFaker().name().fullName();
this.orderAddress = getFaker().address().streetAddress();
this.orderEmail = getFaker().internet().emailAddress();
this.orderPaymentType = order_paymentType;
LOG.info("Instantiating order: " + this.toString());
}
public String getOrderName() {
return this.orderName;
}
public String getOrderAddress() {
return this.orderAddress;
}
public String getOrderEmail() {
return this.orderEmail;
}
public String getOrderPaymentType() {
return this.orderPaymentType;
}
@Override
public String toString() {
return "Order [orderName=" + orderName + ", orderAddress="
+ orderAddress + ", orderEmail=" + orderEmail
+ ", orderPaymentType=" + orderPaymentType + "]";
}
}
我选择了这个,说实话,我不完全知道为什么,处理这种情况的正确方法是什么,更重要的是为什么?
Faker 是一个用于基本生成虚假信息的对象。
答案 0 :(得分:0)
您设计的限制是Faker
将始终存在于所有模型中,这是您应该避免的硬性依赖。到目前为止,当前的Java最佳实践是支持组合而不是继承。
所以我们可以有一个名为DataProvider的接口
interface DataProvider {
String address();
....
}
Fake会实现这个地址
class FakeDataProvider implements DataProvider...
\
现在你可以注入一个DataProvider
public Order(String order_paymentType, DataProvider dataProvider){
this.orderName = dataProvider.name().fullName();
....
}
现在您用其他东西替换Faker
而不触及订单代码。所以我的答案是:不要一起使用继承。
答案 1 :(得分:0)
如果您只想在子类中使用“getFaker()。name()。fullName()”,我认为您最好在类BaseModel中定义一些方法,它们提供了获取fullname,streetAddress的函数。 。除了直接在您的子类中使用Faker(订单)