最佳做法是在父 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?

使用一个具有层次结构的小示例:

在 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