Java 在子类中创建构造函数的最佳实践是什么

Java 在子类中创建构造函数的最佳实践是什么,java,oop,Java,Oop,所以我正在做一个课堂作业,我们需要创建3个课堂: Person、Customer和PreferredCustomer,按该顺序显示层次结构 本人有以下施工人员: public Person() { this.name = ""; this.address = ""; this.phoneNumber = ""; } public Person(String name, String address, String phoneNumber) { this.name

所以我正在做一个课堂作业,我们需要创建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();
}
在首选客户中:

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?我唯一关心的是子类的构造函数将有很长的参数列表。你的想法是什么?谢谢

最好在子构造函数中获取所需的所有参数,因为如果忘记设置字段,然后尝试访问它,则可能会发生NullPointerException


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

最好在子构造函数中获取所需的所有参数,因为如果忘记设置字段,然后尝试访问它,则可能会发生NullPointerException

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

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

公众人物(){
this(“,”“,”“);//当然,这些字段也可以分配给“”。
}
对于具有长参数列表的构造函数,可以使用静态工厂方法返回实例

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

这里有一个例子


公共类食品演示{
公共静态void main(字符串[]args){
foop1=newfoo().setFirstName(“John”).setLastName(“Doe”);
Foo p2=new Foo().setLastName(“Doe”).setFirstName(“Jane”);
系统输出打印LN(p1);
系统输出打印LN(p2);
}
}
福班{
字符串名;
字符串lastName;
public Foo setFirstName(字符串fname){
firstName=fname;
归还这个;
}
public Foo setLastName(字符串lname){
lastName=lname;
归还这个;
}
公共字符串toString(){
返回firstName+“”+lastName;
}
}
默认构造函数的更好方法(imho)是执行以下操作:

公众人物(){
this(“,”“,”“);//当然,这些字段也可以分配给“”。
}
对于具有长参数列表的构造函数,可以使用静态工厂方法返回实例

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

这里有一个例子


公共类食品演示{
公共静态void main(字符串[]args){
foop1=newfoo().setFirstName(“John”).setLastName(“Doe”);
Foo p2=new Foo().setLastName(“Doe”).setFirstName(“Jane”);
系统输出打印LN(p1);
系统输出打印LN(p2);
}
}
福班{
字符串名;
字符串lastName;
public Foo setFirstName(字符串fname){
firstName=fname;
归还这个;
}
public Foo setLastName(字符串lname){
lastName=lname;
归还这个;
}
公共字符串toString(){
返回firstName+“”+lastName;
}
}

我被你的问题弄糊涂了。如果您的父类除了参数构造函数之外没有任何其他构造函数,您将始终必须在子构造函数中声明一个
super(…)
,这是无法避免的。您的问题让我有点困惑。如果您的父类除了参数构造函数之外没有任何其他构造函数,那么您将始终必须在子构造函数中声明一个
super(…)
,无法绕过它。