【发布时间】:2014-12-22 23:37:28
【问题描述】:
我是一名新程序员,我想知道何时使用重载构造函数的最佳实践以及它与单一主构造函数的不同之处。
【问题讨论】:
-
购买 Josh Bloch 的 Effective Java。关于这类事情有很多很好的建议,但是这里的答案太长了。
-
从下面的答案中我学到了最好的使用方法
标签: java
我是一名新程序员,我想知道何时使用重载构造函数的最佳实践以及它与单一主构造函数的不同之处。
【问题讨论】:
标签: java
简短的回答是:您应该在需要时使用重载。
作为一个真实的例子,看看 JLabel API:https://docs.oracle.com/javase/8/docs/api/javax/swing/JLabel.html
JLabel 有很多构造函数:一个只接受一个字符串,一个接受一个字符串和一个图标,一个只接受一个图标,一个根本不接受任何参数。
当你想构造那种 JLabel 时,你会使用每个构造函数:一个显示字符串,一个显示字符串和一个图标,一个只显示一个图标,或者一个不显示任何东西(直到你调用它的 setter 函数之一)。
【讨论】:
当您希望允许用户以多种不同方式创建对象时,构造函数重载很有用。例如,能够以以下不同方式创建简单的 Student 类对象:
new Student(45); // given student id
new Student("name"); // given student name
new Student(45,"name"); // given student registration id and name
这有助于简化根据我们的要求创建对象的任务。您可以将此概念与各种 java API 联系起来,因为它提供了一种初始化类对象的不同方法。
您还可以将Contrustor 重载与构造函数链接结合起来。 这是一个例子:
public Student (int id){
this(id,"ANY-DEFAULT-NAME"); // calls the constructor of same class with 2 params
}
public Student (String name){
this(ANY-DEFAULT-ID,name);// calls the constructor of same class with 2 params
}
public Student (int id,String name){
// here you can initialize the instance variables of the class.
}
【讨论】:
您可以根据需要重载构造函数。例如,假设您有一个名为 Dog 的简单类,它具有一些属性,例如:姓名、品种、生日、所有者和肤色。
public class Dog {
private String name;
private String breed;
private Date birthday;
private String owner;
private String skinColor;
/*Getters and Setters*/
...
}
如果你实例化了一个 Dog 类型的对象并想要设置全部或部分属性的值,你必须调用该对象的所有 setter 方法,但是使用构造函数,你可以省去这一步传递在您实例化对象的每一刻都直接取值。
例子:
public class Dog {
private String name;
private String breed;
private Date birthday;
private String owner;
private String skinColor;
public Dog(String name, String breed,Date birthday,String owner,String skinColor){
this.name = name;
this.breed = breed;
this.birthday = birthday;
this.owner = owner;
this.skinColor = skinColor;
}
/*Getters and Setters*/
...
}
Dog myDog = new Dog("Jose", "Chiguagua",new Date(),"Jhon","Brown");
如果您只想实例化具有名称的对象,您也可以这样做。一个好的做法是,如果您有一个具有填充某些点所必需的属性的对象,请提供默认构造函数,如果您不提供它,您将始终需要传递一些值,例如对象。这为程序员提供了灵活性。
【讨论】: