【问题标题】:java Having multiple constructors for superclassjava有多个超类的构造函数
【发布时间】:2017-06-14 02:46:15
【问题描述】:

我有一个包含 3 个构造函数的超类,我想知道是否有更聪明的方法来编写子类构造函数

public class Person{

private String name;
private int age;
private String homeTown;


public Person(String name){
    this.name = name;
    this.age = 18;
    this.homeTown = "Atlanta";
}

public Person(String name, int age){
    this.name = name;
    this.age = age;
    this.homeTown = "Atlanta";
}

public Person(String name, int age, String homeTown){
    this.name = name;
    this.age = age;
    this.homeTown = homeTown;   
}

我还有一个继承超类的子类

public class Student extends Person{
private double avgGPA;
private int ID;
private String[] classes;

public Student(double avgGPA, int ID, String[] classes, String name){
    super(name);
    this.avgGPA = avgGPA;
    this.ID = ID;
    this.classes = classes;
}

public Student(double avgGPA, int ID, String[] classes, String name, int age){
    super(name, age);
    this.avgGPA = avgGPA;
    this.ID = ID;
    this.classes = classes;
}

public Student(double avgGPA, int ID, String[] classes, String name, int age, String homeTown){
    super(name, age, homeTown);
    this.avgGPA = avgGPA;
    this.ID = ID;
    this.classes = classes;
}

我的子类工作正常并且运行没有错误,但我想知道是否有另一种方法可以为子类编写构造函数而无需编写相同的构造函数 3 次,只是因为超类有 3 个不同的构造函数。

【问题讨论】:

  • 为什么不是一个不可变的类,它有一个私有构造函数和 3 个静态工厂方法来接受参数?
  • 大量重载的构造函数是一种反模式恕我直言;您应该考虑改用构建器模式。
  • 恐怕我对不可变类这样的概念不熟悉。如果你能告诉我,我会查一下。

标签: java inheritance constructor


【解决方案1】:

嗯,Java 中有一些东西可以简化您的超类。您可以使用this(); 调用同一类中的另一个构造函数。因此,不要为每个构造函数设置每个变量,而是使用一个变量设置构造函数并使用this(); 传递默认值。对于您的超类,您可以改用这些:

public Person(String name){
    this(name, 18, "Atlanta");
}

public Person(String name, int age){
    this(name, age, "Atlanta");
}

public Person(String name, int age, String homeTown){
    this.name = name;
    this.age = age;
    this.homeTown = homeTown;   
}

对于子类,我将创建一个名为 setVars 的私有方法,它接收您将使用的三个变量:double avgGPAint IDString[] classes。因此,您的类可以如下所示,而不是在每个构造函数中设置它们:

public Student(double avgGPA, int ID, String[] classes, String name){
    super(name);
    setVars(avgGPA, ID, classes);
}

public Student(double avgGPA, int ID, String[] classes, String name, int age){
    super(name, age);
    setVars(avgGPA, ID, classes);
}

public Student(double avgGPA, int ID, String[] classes, String name, int age, String homeTown){
    super(name, age, homeTown);
    setVars(avgGPA, ID, classes);
}

private void setVars(double avgGPA, int ID, String[] classes) {
    this.avgGPA = avgGPA;
    this.ID = ID;
    this.classes = classes;
}

我认为这与您获得的效率一样高,除非您想按照 QueenSvetlana 的回答所推荐的那样创建静态初始化方法。

【讨论】:

  • @programing_is_hard 没问题。解决您的用户名:它变得更容易。虽然练习并不总是完美的,但通过编程,它可以做到。
【解决方案2】:

类似这样的东西:

public final class Person{

    private final String name;
    private final int age;
    private final String homeTown;
    private double avgGPA;

    private Person(String name, int age, String homeTown, avgGPA){

        this.name = name;
        this.age = age;
        this.homeTown = homeTown;
        this.avgGPA = avgGPA;
    }

    public static Person createPerson(String name, age, homeTown, avgGPA){
        return new Person(name, age, homeTown, avgGPA);
    }

    public static Person createPersonwithoutHomeTown(String name, age,avgGPA){
        return new Person(name, age, "Atlanta", avgGPA);
    }

    public static Person createPersonwithoutAge(String name,avgGPA){
        return new Person(name, 18, "Atlanta", avgGPA);
    }

}

Immutable 对象是在创建后不改变其状态的对象,并且不允许子类化。从长远来看,不可变类是有利的。

【讨论】:

  • 感谢您的回答。我的问题是,如果学生类的 avgGPA 和其他变量仅在 Student.java 中初始化怎么办?如果我正确理解您的代码,看起来我必须在初始化人员对象时输入我的 avgGPA。
  • so 如果我想在不放 avgGPA 的情况下初始化 person 对象,同时让学生代码更高效,有什么方法可以采取吗?
  • @programing_is_hard - 您可以像上面的示例一样创建一个静态方法并提供默认 GPA,因此外部代码无法设置它(请参阅 createPersonwithoutHomeTown,客户端代码不提供亚特兰大,您做。你甚至有另一种方法允许客户端代码提供家乡,如果他们也想的话)。在这种情况下,你是控制者。请记住,我的示例只是示例代码,请阅读不可变性、静态方法并尝试一下
【解决方案3】:

我认为修改您的 Person 对象以使用构建器模式会对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多