【问题标题】:What are the best practices for creating constructors in sub-classes在子类中创建构造函数的最佳实践是什么
【发布时间】:2020-01-11 17:55:46
【问题描述】:

所以我正在为班级做作业,我们需要创建 3 个班级: Person、Customer 和 PreferredCustomer,按该顺序排列层次结构。

就个人而言,我有以下构造函数:

public Person() {
    this.name = "";
    this.address = "";
    this.phoneNumber = "";
}

public Person(String name, String address, String phoneNumber) {
    this.name = name;
    this.address = address;
    this.phoneNumber = phoneNumber;
}

在客户中:

public Customer(boolean isOnMailingList, int customerId) {
    this.isOnMailingList = isOnMailingList;
    this.customerId = customerId;
}

在优惠客户中:

public PreferredCustomer(boolean isOnMailingList, int customerId, double purchaseAmount) {
    super(isOnMailingList, customerId);
    this.purchaseAmount = purchaseAmount;
    this.discountPercentage = calculateDiscountPercentage();
}

所以我的问题主要涉及子类中的构造函数。我应该像在 PreferredCustomer 中那样接受子类的构造函数中的父成员,还是应该在创建对象实例时使用 setter?我唯一担心的是子类的构造函数将有很长的参数列表。你在这里有什么想法?谢谢!

【问题讨论】:

  • 我对你的问题有点困惑。如果您的父类除了参数构造函数之外没有任何其他构造函数,那么您将始终必须在子构造函数中声明super(...),没有办法。

标签: java oop


【解决方案1】:

默认构造函数的更好方法(恕我直言)是执行以下操作:

public Person() {
  this("","",""); // of course the fields could just be assigned "" too.
}

对于具有长参数列表的构造函数,您可以使用静态工厂方法来返回实例。

最后,当您的列表很长并且不想担心参数的位置时,setter 非常棒。每个 setter 都必须返回对象,以便下一个 setter 可以使用它来设置自己的值。

这是一个例子。


    public class FooDemo {
       public static void main(String[] args) {
          Foo p1 = new Foo().setFirstName("John").setLastName("Doe");
          Foo p2 = new Foo().setLastName("Doe").setFirstName("Jane");
          System.out.println(p1);
          System.out.println(p2);
       }
    }

    class Foo {
       String firstName;
       String lastName;

       public Foo setFirstName(String fname) {
          firstName = fname;
          return this;
       }
       public Foo setLastName(String lname) {
          lastName = lname;
          return this;
       }

       public String toString() {
          return firstName + " " + lastName;
       }
    }

【讨论】:

    【解决方案2】:

    最好在孩子的构造函数中获取所有你需要的参数,因为如果你忘记设置一个字段然后尝试访问它,你将面临 NullPointerException 的风险。

    构造函数的职责是生成一个有效对象,该对象封装所有其必要的数据,因此,如果您在创建时有信息,那么您必须使用它,即使构造函数签名变得太长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多