最佳做法是在父 class 中使用受保护的对象,还是将其与 protected/public getter 私有?
Is it best practice to use a protected object in a parent class, or have it private with a protected/public getter?
使用一个具有层次结构的小示例:
- 基础模型
- OrderModel 扩展了 BaseModel
在 BaseModel 中,我想在扩展它的任何 class 中有一个对象 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基本上就是用来生成虚假信息的对象
您设计的限制是 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
替换为其他内容,而无需触及订单代码。所以我的回答是:不要一起使用继承。
如果你只想 "getFaker().name().fullName()" 在你的子 class 中,我认为你最好在你的 class BaseModel 中定义一些方法,它提供了获取全名、街道地址的函数...除了直接在您的 sub-class(Order)
中使用 Faker
使用一个具有层次结构的小示例:
- 基础模型
- OrderModel 扩展了 BaseModel
在 BaseModel 中,我想在扩展它的任何 class 中有一个对象 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基本上就是用来生成虚假信息的对象
您设计的限制是 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
替换为其他内容,而无需触及订单代码。所以我的回答是:不要一起使用继承。
如果你只想 "getFaker().name().fullName()" 在你的子 class 中,我认为你最好在你的 class BaseModel 中定义一些方法,它提供了获取全名、街道地址的函数...除了直接在您的 sub-class(Order)
中使用 Faker