最佳做法是在父类中使用受保护对象,还是将其与受保护/公共getter一起使用?

时间:2017-12-24 13:29:21

标签: java access-modifiers

使用一个小例子,其层次结构为:

  • BaseModel
  • OrderModel扩展BaseModel

在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 是一个用于基本生成虚假信息的对象。

2 个答案:

答案 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(订单)